我相对于C和C++还是新手。在我习惯编程的语言Java中,实现随机数生成非常容易。只需要从一个名为Math的类中调用静态的random方法即可。
int face = ((int)(Math.random() * 6) + 1);
模拟掷骰子的过程...
在C和C++中,您需要通过调用srand函数来"初始化随机数生成器"。
srand ( time(NULL) );
做这件事有什么意义 - 我的意思是每次运行代码都必须重新生成随机数有什么优点吗?
我相对于C和C++还是新手。在我习惯编程的语言Java中,实现随机数生成非常容易。只需要从一个名为Math的类中调用静态的random方法即可。
int face = ((int)(Math.random() * 6) + 1);
模拟掷骰子的过程...
在C和C++中,您需要通过调用srand函数来"初始化随机数生成器"。
srand ( time(NULL) );
做这件事有什么意义 - 我的意思是每次运行代码都必须重新生成随机数有什么优点吗?
给定相同的种子,伪随机数生成器将每次产生相同的序列。因此,关键在于您希望每次运行时是否要生成不同的伪随机数序列。
这实际上取决于您的需求。有时您需要重复一个序列,有时则不需要。您需要了解每个具体应用程序的需求。
绝不能在单个序列生成过程中反复播种。这样做很可能会破坏序列的分布。
通常所称的随机数生成器实际上是伪随机数生成器。这通常意味着如果您提供该序列的“密钥”(称为“种子”),则可以生成相同的随机序列。当您希望测试基于随机化的算法并需要确保可重复结果时,这非常有用。
如果您没有“播种”您的随机数生成器,则默认情况下会使用某些(通常基于系统时间)随机数进行初始化,因此每次运行程序时都会产生不同的序列。
time
的结果,它通常返回一个具有秒分辨率的值。 - Some programmer dudetime(NULL)
。 - Medinoc为了从先前的随机数序列中生成不同的随机数序列(并非总是如此),伪随机数生成器需要种子。如果您不希望出现重复的序列,则需要对伪随机数生成器进行种子设置。
尝试这些代码并查看它们之间的差异。
没有种子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d", rand()%6 + 1);
}
使用种子:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL));
printf("%d", rand()%6 + 1);
}
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
srand(12);
for (int i =0;i<100; i++)
{
cout << rand() << endl;
}
return 0;
}
为避免这种重复,常规做法是使用更独特的值,由于时间始终在变化,而且两个程序在精确到毫秒级别生成随机序列的几率很小,因此可以合理地安全地使用时间作为几乎唯一的种子。int face = (rand() % 6) + 1);
^
|___________ Modulo operator
% 6
将随机数限制在0到5之间,+ 1
用于抵消这个限制,使其变为1到6。"Math.random()
,它返回0.0到1.0之间的浮点数。 - Klas LindbäckMath.random()
。 - Fiddling Bits