rand()使用time()种子的问题

4

我在使用Xcode时遇到了一些困难,无法理解如何使用rand()函数,并将其与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个回答

4

尝试使用随机生成器而不将其转换为整数

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

哇塞,这个不容易。我记得很久以前在我的随机模型中就遇到过这个问题。解决方法是使用一些pragma指令,就我所知.

总之,下面是解决方案,它可以工作。每次随机数都是不同的...有点糊弄人。

#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始终给出0.086,但对于后两个元素仍然是随机的。 - Ock
哦,你很聪明。只需跳过第一个值=]。非常感谢! - Ock

2

典型的rand实现并不是很好。你可以丢弃前几个结果,或者切换到更好的伪随机数生成器。还可以参考:来自comp.lang.c FAQ的我需要一个随机数生成器。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接