سؤال

كتبت هذه الوظيفة للحصول على تعويم عشوائي الزائفة بين 0 .. 1 شاملة:

float randomFloat()
{
      float r = (float)rand()/(float)RAND_MAX;
      return r;
}

ومع ذلك، فإنه دائما يعود 0.563585. نفس الرقم بغض النظر عن عدد المرات التي أقوم بتشغيل تطبيق وحدة التحكم الخاصة بي.

تعديل:

هنا هو تطبيقي بالكامل إذا لزم الأمر:

#include <stdio.h>
#include <stdlib.h>

float randomFloat()
{
      float r = (float)rand() / (float)RAND_MAX;
      return r;
}

int main(int argc, char *argv[])
{
  float x[] = {
        0.72, 0.91, 0.46, 0.03, 0.12, 0.96, 0.79, 0.46, 0.66, 0.72, 0.35, -0.16,
        -0.04, -0.11, 0.31, 0.00, -0.43, 0.57, -0.47, -0.72, -0.57, -0.25,
        0.47, -0.12, -0.58, -0.48, -0.79, -0.42, -0.76, -0.77
  };

  float y[] = {
        0.82, -0.69, 0.80, 0.93, 0.25, 0.47, -0.75, 0.98, 0.24, -0.15, 0.01,
        0.84, 0.68, 0.10, -0.96, -0.26, -0.65, -0.97, -0.03, -0.64, 0.15, -0.43,
        -0.88, -0.90, 0.62, 0.05, -0.92, -0.09, 0.65, -0.76      
  };

  int outputs[] = {
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  };

  int patternCount = sizeof(x) / sizeof(int);

  float weights[2];
  weights[0] = randomFloat();
  weights[1] = randomFloat();

  printf("%f\n", weights[1]);

  float learningRate = 0.1;

  system("PAUSE");
  return 0;
}
هل كانت مفيدة؟

المحلول

تحتاج إلى الاتصال

srand(time(NULL));

قبل استعمال rand لأول مرة. time في داخل <time.h>.

تحرير: كما يشير Jonathan Leffler، يتم التنبؤ بهذا بسهولة، لذلك لا تحاول استخدامه للتطبيق.

نصائح أخرى

هذا بسبب مولد عشوائي C هو مستعار-الولد مولد. (وهذا هو، راجع للشغل، شيء جيد جدا، مع العديد من التطبيقات). (معيار ANSI C يتطلب مثل هذا المولد العشوائي الزائدي)

أساسا في كل مرة يتم فيها إعادة تطبيق تطبيق وحدة التحكم يستخدم نفس البذور [الافتراضي] للمولد العشوائي.

عن طريق إضافة خط مثل

  srand(time(NULL));

سوف تحصل على بذرة مميزة في كل مرة، وتسلسل الرقم المنتج مع تختلف وفقا لذلك.
ملحوظة: تحتاج فقط إلى الاتصال SRAND () مرة واحدة، ليس قبل كل مرة اتصل فيها Rand ().

يحرر: (اختبار / تصحيح الوقت تلميح)
من ملاحظة بواسطة Artelius] لأغراض الاختبار، من الأفضل أن Srand (some_const)، وتغيير قيمة الثابت بين المدى. بهذه الطريقة إذا كان خطأ يتجلى نفسه بسبب مزيج من أرقام عشوائية، فستتمكن من إعادة إنتاجه.

drand48. هو مثالي لاستخدامك، أفضل من (float)rand()/RAND_MAX, ، لأن

ال drand48() و erand48() وظائف إرجاع القيم غير السلبية، الدقة المزدوجة، النقطة العائمة، موزعة بشكل موحد على الفاصل الزمني [0.0، 1.0].

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int i;

    srand48(time(NULL));

    for (i = 0; i < 10; i++)
        printf("%g\n", drand48());

    return 0;
}

عليك أن تهيئة بذرة عشوائية

void srand ( unsigned int seed );

يمكنك أن تأخذ على سبيل المثال وقت النظام.

هل تسميها أكثر من مرة؟ الراند () سوف تعيد دائما نفس العشوائية الزائفة. قد ترغب في الاتصال Srand () مع بعض البذور اللطيفة، مثل الوقت الحالي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top