【问题标题】:rand with seed does not return random if function looped如果函数循环,带有种子的 rand 不会返回随机数
【发布时间】:2012-01-09 00:08:15
【问题描述】:

我在下面写了这段 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);
    }
}

【问题讨论】:

  • 在你的生活中播种一次,而不是一直。
  • 您一遍又一遍地用相同的数字初始化随机数生成器(只要time(NULL) 返回相同的值)。如果您希望数字看起来像随机的,请不要这样做。还记得#include &lt;time.h&gt;time() 原型。
  • Always repeated numbers given by rand() 的可能副本。请在提问前使用 SO 的搜索工具。

标签: c random


【解决方案1】:

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

【讨论】:

  • @xambo:当您快速连续多次调用time() 时,它很可能返回相同的值,因为时钟还没有滴答作响。当您使用相同的种子调用srand() 时,对rand() 的以下调用将返回相同的值。正如我所说,不要在每次需要随机值时都尝试重新初始化生成器。
【解决方案2】:

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

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

【讨论】:

  • rand() 可能有一个低周期,所以我仍然会不时调用 srand (如果在一个大循环中)
【解决方案3】:

seed()的要点是用已知值开始随机数序列,
给定相同的种子,您将始终得到相同的数字序列。

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

【讨论】:

    【解决方案4】:

    试试这个:

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

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

    【讨论】:

    • 这不是答案。 (但它确实向 OP 解释了他的部分问题
    【解决方案5】:

    如果您想在每次致电 random() 时重新播种(额外随机性),您可以这样做:

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

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

    【讨论】:

    • 糟糕——在这里使用clock() 并没有增加多少价值,因为如果您的程序没有任何 I/O 延迟,它大致是确定性的。
    • 好吧,除非你以某种方式始终得到 0,否则时钟至少会增加一些额外的熵,所以这很重要。
    • getpid() 可能是解决time() 限制的一个很好的补充。
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2014-10-04
    • 2017-01-25
    • 2011-04-04
    相关资源
    最近更新 更多