产生随机数的能力可以是有用的在某些类型的程序,特别是在游戏中,统计建模程序,和科学模拟,需要模拟随机事件。以游戏为例-没有随机事件,怪物会总是攻击你同样的方式,你会总是找到相同的宝藏,地牢布局不会改变,等等,这不会是一个非常好的游戏。
那么,我们如何产生随机数呢?在现实生活中,我们经常会产生随机的结果,做的事情就像是翻转一个硬币,掷骰子,或洗牌一副牌。这些事件涉及许多物理变量(如重力、摩擦力、空气阻力,动力,等等),他们变得几乎无法预测或控制,而产生的结果,是为了所有的意图和目的随机。
然而,计算机不是利用物理变量来设计的,你的电脑不能扔硬币,掷骰子,或洗牌。计算机生活在一个控制的电子世界里,一切都是二进制(假或真),没有在两者之间。由他们的性质,计算机被设计产生的结果是尽可能的可预见的。当你告诉计算机计算2 + 2时,你总是希望答案是4。不3或5次。
因此,计算机通常不会产生随机数。相反,他们必须模拟随机性,这是最经常使用的伪随机数发生器。
伪随机数生成器(PRNG)是一个程序,需要一个起始数(称为种子),并进行数学运算,它转化为其他一些数字,似乎是无关的种子。然后,它需要生成的数字,并执行相同的数学运算,它将其转换成一个新的数字,似乎与它所产生的数量无关。通过不断地将算法应用到最后一个生成的数,它可以生成一系列新的数字,将出现是随机的,如果该算法是复杂的。
每一个数字似乎是相当随机的相对于前一个。事实证明,我们的算法其实不是很好,因为我们将在稍后讨论的原因。但它确实有效地说明PRNG数产生的原理。
在C++生成随机数
C(通过扩展C++)带有一个内置的伪随机数发生器。这是两个单独的功能,活头文件cstdlib中实现:
srand()设置初始种子值的值是通过由调用者。srand()应该只被调用一次。
rand()生成序列中的下一个随机数。这个数字将是0 rand_max之间的随机整数,一个常数,通常设置为32767文件cstdlib。
这里有一个使用这些函数的示例程序:
那么,我们如何产生随机数呢?在现实生活中,我们经常会产生随机的结果,做的事情就像是翻转一个硬币,掷骰子,或洗牌一副牌。这些事件涉及许多物理变量(如重力、摩擦力、空气阻力,动力,等等),他们变得几乎无法预测或控制,而产生的结果,是为了所有的意图和目的随机。
然而,计算机不是利用物理变量来设计的,你的电脑不能扔硬币,掷骰子,或洗牌。计算机生活在一个控制的电子世界里,一切都是二进制(假或真),没有在两者之间。由他们的性质,计算机被设计产生的结果是尽可能的可预见的。当你告诉计算机计算2 + 2时,你总是希望答案是4。不3或5次。
因此,计算机通常不会产生随机数。相反,他们必须模拟随机性,这是最经常使用的伪随机数发生器。
伪随机数生成器(PRNG)是一个程序,需要一个起始数(称为种子),并进行数学运算,它转化为其他一些数字,似乎是无关的种子。然后,它需要生成的数字,并执行相同的数学运算,它将其转换成一个新的数字,似乎与它所产生的数量无关。通过不断地将算法应用到最后一个生成的数,它可以生成一系列新的数字,将出现是随机的,如果该算法是复杂的。
写一个PRNG实际上是相当容易的。这里是一个短程序,产生100个伪随机数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
unsigned int PRNG()
{
// our initial starting seed is 5323
static unsigned int seed = 5323;
// Take the current seed and generate a new value from it
// Due to our use of large constants and overflow, it would be
// very hard for someone to predict what the next number is
// going to be from the previous one.
seed = (8253729 * seed + 2396403);
// Take the seed and return a value between 0 and 32767
return seed % 32768;
}
int main()
{
// Print 100 random numbers
for (int count=0; count < 100; ++count)
{
std::cout << PRNG() << "\t";
// If we've printed 5 numbers, start a new row
if ((count+1) % 5 == 0)
std::cout << "\n";
}
}每一个数字似乎是相当随机的相对于前一个。事实证明,我们的算法其实不是很好,因为我们将在稍后讨论的原因。但它确实有效地说明PRNG数产生的原理。
在C++生成随机数
C(通过扩展C++)带有一个内置的伪随机数发生器。这是两个单独的功能,活头文件cstdlib中实现:
srand()设置初始种子值的值是通过由调用者。srand()应该只被调用一次。
rand()生成序列中的下一个随机数。这个数字将是0 rand_max之间的随机整数,一个常数,通常设置为32767文件cstdlib。
这里有一个使用这些函数的示例程序:
#include <iostream>
#include <cstdlib> // for rand() and srand()
int main()
{
srand(5323); // set initial seed value to 5323
// Print 100 random numbers
for (int count=0; count < 100; ++count)
{
std::cout << rand() << "\t";
// If we've printed 5 numbers, start a new row
if ((count+1) % 5 == 0)
std::cout << "\n";
}
}

被折叠的 条评论
为什么被折叠?



