【发布时间】:2020-04-06 03:00:26
【问题描述】:
我想知道从索引中获取随机数的好方法。基本上,这是我想要的一个例子。
根据我对std::rand() / rand() 工作原理的了解,每次调用它时它都会给你一个随机数,每次你通过调用 std::srand 重置种子时,它都会给出相同的确切数字.但是 rand 的工作方式似乎非常全球化,这意味着每次调用它时,数字都会改变原始种子中的某个索引(我知道这并不是它在引擎盖下的工作方式)
// User manually provides a seed, not by std::time(nullptr)
get_random(3); // Return 1641
get_random(67); // returns 2782
get_random(5); // return 9832
get_random(67); // return 2782
请注意,如果我重复一个索引,我每次仍然从种子中得到相同的结果。我稍微考虑了一下,这是我最好的结果
int Class::get_random(int index) {
std::srand(user_provided_seed); // reset the seed
for (int i = 0; i < index; i++) {
std::rand();
}
return std::rand();
}
上面的工作正常,基本上它只是期望一个随机数作为索引并使用这个数字,但我觉得上面的工作有点太多了,在我的程序中我实际上确实希望用户传入一个相当大的索引,大约 1000 秒,我觉得简单地调用 std::rand() 1000 次会浪费 CPU 时间。
有没有更好的方法来做到这一点?也许已经包含了一个功能,可以满足我的需要。另请注意,我不需要真正的随机数,而伪随机数非常适合我的情况。
【问题讨论】:
-
小心!!! c++ 对
rand的要求与 c 不同。使用 c,可以保证除了对 rand 的调用之外,其他任何东西都不会在伪随机数序列中前进。查看以下内容的“兼容性”部分:cplusplus.com/reference/cstdlib/rand -
如果你的类是only使用
rand()的代码(即你程序中的所有其他代码都通过你的类并且不调用srand()或@987654329 @直接)您可以将所有生成的随机值存储在容器中。然后get_random(index)可以检查该容器 - 如果index有效,则从容器中返回元素,否则在循环中根据需要生成更多元素,可选择将它们存储在容器中,并返回所需的值。您还可以单独预先生成随机值以填充容器,并在以后检索它们 -
@enhzflep 注意到了,虽然我从来没有打算使用 C 版本
-
@NekoBit - 是的,我知道。正是出于这个原因,我才提到它。使用 c++ 时存在一种可能性,即您不会每次都返回相同的数字序列。 ;)