rand()播种时间()问题

时间:2010-09-12 02:28:34

标签: c time random

我很难弄清楚如何使用rand()并使用Xcode将其与time()一起播种。我想生成介于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 个答案:

答案 0 :(得分:2)

尝试随机化随机生成器而不将其强制转换为

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

霍莉莫莉......这个并不容易。我记得很久以前在我的随机模型中我遇到了这个问题。解决方法是使用一些pragma derective,据我记得。

以下是解决方案,它的工作原理。每次都是随机数......虽然有点儿的喜欢。

#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);
}

答案 1 :(得分:2)

典型的rand实现并不是很好。您可以丢弃前几个结果,或者您可以切换到更好的伪随机数生成器。另请参阅comp.lang.c常见问题解答中的I need a random number generator.

答案 2 :(得分:0)

rand()通常是线性同余生成器。我怀疑它是rand-fbsd.c。 time()也不是一个非常好的种子,因为只有最后几位在短时间内发生了显着变化。

random()好一点。还要考虑使用sranddev()或srandomdev()播种。