我想一次创建3个随机数(同时)。然而,即使它们实际上是随机的,它们一次也给我相同的数字。例如:
------------------------
Variable: A B C
------------------------
Time 1 : 5 5 5
Time 2 : 3 3 3
Time 3 : 9 9 9
------------------------
他们认为根本就是不同的数字。根据观察,我可以看到我的代码一次只能选择一个随机数(间隔1秒)。这是我正在使用的生成器代码:
unsigned int CMain::GenerateRandom(int min, int max)
{
srand((unsigned)time(0));
unsigned int random_integer;
int lowest = min, highest = max;
int range = (highest - lowest) + 1;
random_integer = lowest + int(range * rand() / (RAND_MAX + 1.0));
return random_integer;
}
我怎么能一次生成一个完全随机的数字?请帮忙。
谢谢。
答案 0 :(得分:10)
你的问题是你在每次通话中使用你不应该做的当前时间重置随机种子。
在查询任意随机数之前,请先致电srand()
- 这已经足够了。
现在,您始终将随机种子重置为完全相同的值(使用当前时间)。 PC中的随机数根本不是随机数。相同的种子将始终导致稍后生成的同一组随机数。这是有意的并且用于例如游戏的存档游戏总是会发生相同的事情,而不必保存生成的每个随机数等等。
答案 1 :(得分:3)
每次生成新的随机数时都不要致电srand()
。在程序开始时调用一次,然后在每次需要新的随机数时调用rand()
。
仅供参考:rand()
返回的值不是“完全随机”。它们是算法生成的伪随机数。 (这与你的问题无关。)
答案 2 :(得分:2)
问题是你每次迭代都在调用srand()。 Srand()根据当前时间戳设置种子。因此,您只需要调用一次srand(),然后调用rand()来生成一个新的伪随机数。我说伪随机因为计算机无法生成真正的随机数。
示例代码:
#include <iostream>
#include <cstdlib>
int main()
{
int i, r;
srand(time(0));
for(i = 0; r <= 20000; i++)
r = rand();
return 0;
}
答案 3 :(得分:2)
时间(0)变化缓慢。如果您快速查询 GenerateRandom ,您可以多次获得相同的数字。
但总的来说,这不是生成随机数的正确方法。您希望在任何其他函数使用它之前,只为随机数生成器播种一次。将 rand 视为全局单例对象。如果您的任何功能通过调用 srand 修改其种子,则更改将影响对 rand 的所有其他调用。