rand () заполнение с проблемой time () - PullRequest
3 голосов
/ 12 сентября 2010

Мне трудно понять, как использовать rand () и заполнить его временем () с помощью Xcode.Я хочу генерировать случайные десятичные числа от 0 до 1.

Код дает мне, казалось бы, случайные числа для элементов 1 и 2, но элемент 0 всегда где-то около 0,077.Любые идеи, почему это будет?

Мой код:

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

int main(void)
{
double array[3];

double rand_max = RAND_MAX;

srand((int)time(NULL));

for (int iii = 0; iii < 3; iii++)
    array[iii] = rand() / rand_max;

for (int iii = 0; iii < 3; iii++)
    printf("Element %d is: %lf.\n", iii, array[iii]);

return(0);
}

Вывод для нескольких прогонов был следующим:

[Session started at 2010-09-11 21:19:07 -0500.]

Element 0 is: 0.076918.

Element 1 is: 0.753664.

Element 2 is: 0.824467.

The Debugger has exited with status 0.
[Session started at 2010-09-11 21:19:12 -0500.]
Element 0 is: 0.076957.
Element 1 is: 0.411353.
Element 2 is: 0.602494.

The Debugger has exited with status 0.

[Session started at 2010-09-11 21:19:16 -0500.]

Element 0 is: 0.076988.

Element 1 is: 0.937504.

Element 2 is: 0.624915.

The Debugger has exited with status 0.

[Session started at 2010-09-11 21:19:24 -0500.]

Element 0 is: 0.077051.

Element 1 is: 0.989806.

Element 2 is: 0.669757.

Ответы [ 3 ]

2 голосов
/ 12 сентября 2010

Типичные rand реализации просто не очень хороши.Вы можете отбросить первые несколько результатов или переключиться на лучший генератор псевдослучайных чисел.Также см .: Мне нужен генератор случайных чисел. из FAQ по comp.lang.c.

2 голосов
/ 12 сентября 2010

попробуйте рандомизировать генератор случайных чисел, не приводя его в

/* initialize random seed: */
srand ( time(NULL) );

Холли Молли ... это не легко.Я помню давно в моих стохастических моделях у меня была эта проблема.Насколько я помню, решение заключалось в использовании некоторого прагма-деректива. В любом случае

- это решение, и оно работает.Случайные числа каждый раз ... хоть и дурацкие.

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

int main(void)
{
    double array[10];

    double rand_max = RAND_MAX;

    srand(time(NULL));

    for (int iii = 0; iii < 9; iii++){
        rand();
        array[iii] = rand() / rand_max;
    }

    for (int iii = 0; iii < 9; iii++){
        printf("Element %d is: %lf.\n", iii, array[iii]);
    }


    return(0);
}
0 голосов
/ 12 сентября 2010

rand () обычно является линейным конгруэнтным генератором. Я подозреваю, что это rand-fbsd.c . time () также не очень хорошее начальное число, так как только младшие биты значительно меняются за короткое время.

random () немного лучше. Также рассмотрите возможность заполнения с помощью sranddev () или srandomdev ().

...