C++ 如何一次生成一个完全随机的数字?

C++ 如何一次生成一个完全随机的数字?,c++,C++,我想一次(同时)创建3个随机数。然而,他们一次返回相同的数字,尽管它们实际上是随机的。例如: ------------------------ Variable: A B C ------------------------ Time 1 : 5 5 5 Time 2 : 3 3 3 Time 3 : 9 9 9 ------------------------ 它们应该是完全不同的数字。通过观察,我可以看到我的代码一次只能选择一个随机数(

我想一次(同时)创建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;
}
我如何一次生成一个完全随机的数字?请帮忙


谢谢。

您的问题是,您正在使用当前时间重置每个呼叫的随机种子,这是您不应该做的

在查询任意随机数之前调用
srand()


现在,您总是将随机种子重置为完全相同的值(使用当前时间)。电脑中的随机数根本不是随机的。相同的种子将始终导致以后生成相同的随机数集。这是有意的,并用于例如savegames for games,以便在不必保存生成的每个随机数的情况下总是发生相同的事情,等等。

您的问题在于,您正在使用当前时间重置每个调用的随机种子,而您不应该这样做

在查询任意随机数之前调用
srand()

现在,您总是将随机种子重置为完全相同的值(使用当前时间)。电脑中的随机数根本不是随机的。相同的种子将始终导致以后生成相同的随机数集。这是有意的,并用于例如savegames for games,以便在不必保存生成的每个随机数的情况下始终让相同的事情发生,等等。

不要在每次生成新的随机数时调用
srand()
。在程序开始时调用它一次,然后在每次需要新的随机数时调用
rand()

仅供参考:从
rand()
返回的值不是“完全随机的”。它们是由算法生成的伪随机数。(这与您的问题无关。)

不要每次生成新的随机数时调用
srand()
。在程序开始时调用它一次,然后在每次需要新的随机数时调用
rand()


仅供参考:从
rand()
返回的值不是“完全随机的”。它们是由算法生成的伪随机数。(但这与您的问题无关。)

问题在于每次迭代都要调用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;
}
#包括
#包括
int main()
{
int i,r;
srand(时间(0));

对于(i=0;r而言,问题在于每次迭代都要调用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;
}
#包括
#包括
int main()
{
int i,r;
srand(时间(0));
对于(i=0;r时间(0)变化缓慢。如果快速查询GeneratorDOM,可以多次获得相同的数字

但一般来说,这不是生成随机数的正确方法。在任何其他函数使用随机数生成器之前,您只想为其设置一次种子。请将rand视为全局单例对象。如果您的任何函数通过调用srand修改其种子,则此更改将影响对的所有其他调用ng>随机数

时间(0)变化缓慢。如果快速查询GeneratorDOM,可以多次获得相同的数字


但一般来说,这不是生成随机数的正确方法。在任何其他函数使用随机数生成器之前,您只想为其设置一次种子。请将rand视为全局单例对象。如果您的任何函数通过调用srand修改其种子,则此更改将影响对的所有其他调用ng>rand

那么我该如何解决这个问题?我不太熟悉生成随机数。只需将调用移动到
srand()
在你的程序开始时-不要使用该函数,你就没事了。
电脑中的随机数根本不是随机数。
这不完全是真的。具体来说,这是微软的问题。Linux有
/dev/Random
使用硬件源。但为了简单(非加密)就其目的而言,即使是Windows也有一个不错的算法(
rand_s()
)。@MSalters:rand()也是如此
,它被定义为返回一个伪随机数。我不明白
/dev/random
或Microsoft与这个问题有什么关系。这是很明显的:PRNG的定义基本上是不随机的。但这个答案基本上是说PC中的所有RNG都是PRNG:“将始终导致相同的随机数集”第二个反例:VIA CPU有硬件RNG。那么如何解决这个问题呢?我不太熟悉生成随机数。只需将调用移动到
srand()即可
在你的程序开始时-不要使用该函数,你就没事了。
电脑中的随机数根本不是随机数。
这不完全是真的。具体来说,这是微软的问题。Linux有
/dev/Random
使用硬件源。但为了简单(非加密)就其目的而言,即使是Windows也有一个不错的算法(
rand_()
)。@MSalters:rand()
,它被定义为返回一个伪随机数。我不知道
/dev/random
或Microsoft与这个问题有什么关系。嗯,这有点奇怪