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

C 如果函数循环,带种子的rand不会返回random,c,random,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 va

我在下面写了这个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);
    }
}
#包括
#包括
int myrand(){
国际货币基金组织;
int seed=时间(空);
srand(种子);
ue_imsi=rand();
返回ue_imsi;
}
int main()
{
int值=0;
int i=0;
对于(i=0;i<5;i++)
{
value=myrand();
printf(“值为%d\n”,值);
}
}
srand()
调用移动到循环之前的
main()

换句话说,调用
srand()
一次,然后重复调用
rand()
,而不再调用
srand()

#包括
#包括
int main()
{
int值=0;
int i=0;
srand(时间(空));
对于(i=0;i<5;i++)
{
value=rand();
printf(“值为%d\n”,值);
}
}

种子设定生成器应该执行一次(当然,对于要生成的每个随机数序列!):

#包括
#包括
int main()
{
int seed=时间(空);
srand(种子);
int值=0;
int i=0;
对于(i=0;i<5;i++)
{
value=rand();
printf(“值为%d\n”,值);
}
}
seed()的要点是以一个已知值开始随机数序列,
对于相同的种子,您将始终获得相同的数字序列

这就是为什么您有seed(),它既允许您为测试生成相同的序列,也允许您在给定一个随机种子(通常是时间)的情况下,每次都会得到不同的序列。请尝试以下操作:

#include <stdio.h>
#include <time.h>
int main(void) {
    for (int i = 0; i < 10; i++) {
        printf("%ld\n", (long)time(NULL));
    }
}
#包括
#包括
内部主(空){
对于(int i=0;i<10;i++){
printf(“%ld\n”,(长)时间(NULL));
}
}
我的“猜测”是,每次调用
random()
,都会打印10个相等的值:)

如果你想重新设定种子(额外的随机性),这里有一种方法可以做到:

srandom( time(0)+clock()+random() );
  • time()
    每秒更新一次,但每次运行程序时都会有所不同
  • clock()
    更新频率更高,但每次运行程序时都从0开始
  • random()

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

在你的一生中播种一次,而不是一直播种。你用相同的数字一次又一次地初始化随机数生成器(只要
time(NULL)
返回相同的值)。如果你想让数字看起来像随机的,就不要这样做。还要记住为
time()
prototype.prototype添加
。提问前请使用SO的搜索功能。@xambo:当您连续快速调用
time()
几次时,很可能返回相同的值,因为时钟没有滴答作响。当使用相同的种子调用
srand()
时,以下对
rand()
的调用将返回相同的值。正如我所说的,不要每次需要一个随机值时都尝试重新初始化生成器。哎呀,使用
clock()
在这里不会增加太多的值,因为如果程序没有任何I/O延迟,这是大致确定的。除非以某种方式一致地得到0,否则时钟将至少增加一些额外的熵位,所以它很重要。
getpid()
可能是解决时间限制的一个很好的补充()
。这不是一个答案。(但它确实向OP解释了他的部分问题)rand()可能有一个较低的周期,所以我仍然会不时地调用srand(如果在一个大循环中)
#include <stdio.h>
#include <time.h>
int main(void) {
    for (int i = 0; i < 10; i++) {
        printf("%ld\n", (long)time(NULL));
    }
}
srandom( time(0)+clock()+random() );