这不会是一个非常好的游戏

产生随机数的能力可以是有用的在某些类型的程序,特别是在游戏中,统计建模程序,和科学模拟,需要模拟随机事件。以游戏为例-没有随机事件,怪物会总是攻击你同样的方式,你会总是找到相同的宝藏,地牢布局不会改变,等等,这不会是一个非常好的游戏。
那么,我们如何产生随机数呢?在现实生活中,我们经常会产生随机的结果,做的事情就像是翻转一个硬币,掷骰子,或洗牌一副牌。这些事件涉及许多物理变量(如重力、摩擦力、空气阻力,动力,等等),他们变得几乎无法预测或控制,而产生的结果,是为了所有的意图和目的随机。
然而,计算机不是利用物理变量来设计的,你的电脑不能扔硬币,掷骰子,或洗牌。计算机生活在一个控制的电子世界里,一切都是二进制(假或真),没有在两者之间。由他们的性质,计算机被设计产生的结果是尽可能的可预见的。当你告诉计算机计算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";
	}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值