【问题标题】:change random seed in program c++ [duplicate]在程序c ++中更改随机种子[重复]
【发布时间】:2016-04-25 17:49:20
【问题描述】:

在我的程序中,我有一个函数return_random_vector(),它接受一组数字,比如1,2,3,4,5,并返回随机重新排列的数字,比如2,5,1,4,3

为了做到这一点,我设置了种子srand(time(NULL))。对于我的程序,我希望能够再次使用1,2,3,4,5 调用此函数并获得它们的另一个重新排列,例如3,1,4,5,2

有没有办法可以设置srand() 以便重置种子?

【问题讨论】:

标签: c++ random


【解决方案1】:

要获得不同的集合,您可以再次调用return_random_vector()而不在两者之间调用srand()

在第一次调用return_random_vector() 之后立即调用srand((unsigned)time(NULL)) 可能会生成相同的集合,因为time() 可能会返回相同的值,即经过的时间(以秒为单位)。

因此,您实际上会将种子重置为与第一次调用之前相同的值。并且将种子设置为相同的值将再次生成相同的随机数集。

你也可以看看std::shuffle (C++11)

【讨论】:

  • @amdn,可能不同,但不一定很多不同,因为种子值只有几位(可能只有一位)发生了变化。生成器仍处于非常相似的状态。我曾经使用过一个 shell 脚本,它通过类似shuf | head -n1 的方式从列表中选择一个随机项目,我注意到如果我快速连续多次运行它,某些值的选择频率明显高于其他值。如果我等了一会儿再做同样的事情,就会经常选择其他值。
  • @Wyzard 是可能的,rand() 通常实现为线性同余生成器 (wikiwand.com/en/Linear_congruential_generator),具体取决于它提供多少随机位以及程序使用多少随机位,您可以查看种子相差 1 时的模式。
【解决方案2】:

对于*nix系统,你可以试试这个

unsigned seed;

read(open("/dev/urandom", O_RDONLY), &seed, sizeof(seed));
srand(seed);

对于 Windows,RtlGenRandom 将为您提供一个随机字节数组,可用作种子。或者只是用作伪随机数。

【讨论】:

    【解决方案3】:

    每次使用不同的值调用 srand() 时,都会初始化随机数生成器以返回不同的值序列。

    只需以相同的方式再次调用 srand() 即可。由于时间值可能会有所不同,因此您将从 rand() 获得不同的结果序列。

    如果您可能需要在 time() 值更改之前执行此操作,您可以使用: srand(时间(NULL)+rand());

    自从我上次编写 C++ 以来已经有一段时间了,所以我不确定您是否需要在进行加法之前转换一个或其他值,因为它们是 int 和 time_t。

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 2016-12-30
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多