如果函数循环,带种子的rand不会随机返回

时间:2011-11-29 16:41:48

标签: c random

我在下面写了这个C代码,当我循环时,它返回一个随机数。如果执行myrand(),如何实现5个不同的随机值?

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

int myrand() {
    int ue_imsi;
    int seed = time(NULL);
    srand(seed);
    ue_imsi = rand();

    return ue_imsi;
}

int main()
{
    int value = 0;
    int i=0;
    for (i=0; i< 5; i++)
    {
        value =myrand();
        printf("value is %d\n", value);
    }
}

5 个答案:

答案 0 :(得分:23)

播种发生器应该进行一次(当然要生成每个随机数序列!):

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

int main()
{
    int seed = time(NULL);
    srand(seed);
    int value = 0;
    int i=0;
    for (i=0; i< 5; i++)
    {
        value =rand();
        printf("value is %d\n", value);
    }
}

答案 1 :(得分:5)

在循环播放之前将srand()电话移至main()

换句话说,请拨打srand()一次,然后重复拨打rand(),而无需再调用srand()

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

int main()
{
    int value = 0;
    int i = 0;
    srand(time(NULL));
    for (i = 0; i < 5; i++)
    {
        value = rand();
        printf("value is %d\n", value);
    }
}

答案 2 :(得分:0)

种子()的要点是开始具有已知值的随机数序列,
然后,在给定相同种子的情况下,您将始终获得相同的数字序列。

这就是为什么你有seed(),它允许你生成相同的序列进行测试,或者给出一个随机的种子(通常是时间)你每次都得到一个不同的序列

答案 3 :(得分:0)

试试这个:

#include <stdio.h>
#include <time.h>
int main(void) {
    for (int i = 0; i < 10; i++) {
        printf("%ld\n", (long)time(NULL));
    }
}

我的“猜测”是将打印10个相等的值:)

答案 4 :(得分:-2)

如果你想在每次拨打random()时重新设置(额外的随机性),这是你可以做到的一种方式:

srandom( time(0)+clock()+random() );
  • time()每秒更新一次,但每次运行程序时都会有所不同
  • clock()更频繁地更新,但每次运行程序时都从0开始
  • random()如果您的循环速度快于clock()
  • 的粒度,请确保您(通常)不会连续两次重播相同的值

当然,如果你真的想要随机性,你可以做得更多 - 但这是一个开始。