程序如何生成随机变量
我一直都很好奇,程序是如何生成随机行为的。比如单机格斗类游戏,电脑控制的人物,它的下一步动作大多是随机来的,谁不说不准它【电脑控制的选手】在下一秒是准备前进还是后退。
按照我的理解,程序肯定是固定的代码,固定的算法,按照这个逻辑,你让程序执行一万次,它还是重复那一万次老动作。那对于任意可能的概率事件,程序是如何实现的呢??求高人解惑,谢谢!!
[解决办法]
time.h 是c标准库的头文件,包含一系列与时间相关的公共,
其中它包含的time(long)函数就是用来获取一个时间,通常可以用这个时间来作为随机数的种子
计算器中的提到的随机数术语,一般都是指伪随机数。
另外一些所谓“不重复的随机数”这种说法也是有悖逻辑的,既然是随机,怎么又可能限制它不能重复。
引一些文章
quote:
随机数
随机数是专门的随机试验的结果。
在统计学的不同技术中需要使用随机数,比如在从统计总体中抽取有代表性的样本的时候,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡罗模拟法计算的时候等等。
产生随机数有多种不同的方法。这些方法被称为随机数发生器。随机数最重要的特性是:它所产生的后面的那个数与前面的那个数毫无关系。
真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。
在实际应用中往往使用伪随机数就足够了。这些数列是“似乎”随机的数,实际上它们是通过一个固定的、可以重复的计算方法产生的。计算机或计算器产生的随机数有很长的周期性。它们不真正地随机,因为它们实际上是可以计算出来的,但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。
在真正关键性的应用中,比如在密码学中,人们一般使用真正的随机数。
伪随机数
首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。
伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。(严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机。而未来的量子计算机有可能产生基于自然规律的不可重现的“真”随机数)。
软件常用的产生随机数的方法
在软件上计算机常用的产生随机数的算法为线性同余算法,即使用下面的公式递推产生不同的随机数.
Ni+1=(A* Ni + B)% M 其中i = 0,1,…,M-1
c语言中的rand()函数即是通过该公式递推产生随机数的,常用当前的系统时间为种子。
通过该公式可以看出,产生的随机数是明显有规律可寻的,每一个随机数都是在前一个随机数的基础上通过公式计算得来的,所以通过该方法得来的随机数的随机性很差。当然,适当的选取A、B和M,能够产生一定看似有随机性的随机数字。N0 就是随机种子。
所以为了提高计算机产生的随机数的随机性,在这里我们通过收集系统随机的物理量来填充随机数缓冲池,比如键盘敲击时间、鼠标点击时间、cpu运行参数等,通过这些方法得到的随机数具有很高的随机性。可达到真随机数的要求。