更改程序 C++ 中的随机种子

change random seed in program c++

本文关键字:随机 种子 C++ 更改程序      更新时间:2023-10-16

在我的程序中,我有一个函数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()以便可以重置种子?

要获得不同的集合,您可以再次调用return_random_vector()而无需在中间调用srand()

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

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

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

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

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

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

距离我上次写C++已经有一段时间了,所以我不确定在添加之前是否需要转换一个或另一个值,因为它们是 int 和 time_t。

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

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

对于Windows,RtlGenRandom会给你一个随机字节数组,可以用作种子。或者只是用作伪随机数。