- 0X32 模块搜寻
对于人来说,每天经历的随机事件太多了.但是对于计算机来说随机反而是非常困难的.用一些学派的观点来看,人倾向于把自己还没有完全掌握规律的事情描述为随机(永远掌握不了的就是本征随机).而计算机是彻彻底底由人设计,制造,操控的系统.相对来说人对计算机比对自然界中别的东西了解得多,所以,很难产生真正的随机.
我们又经常需要在计算机上模拟随机过程(比如做一个摇色子的游戏或者做统计分析).这就需要用到一些特殊方法.
既然计算机内部不容易产生随机,那么我们就可以从外部输入.比如实际投色子100次,把数据记录下来,供以后用到随机数的时候用.
计算机中一切都是确定的,一般不存在真正的随机(内部出现了真正的随机,一般都是故障).但是我们可以伪造随机数.伪造的随机数并不是真正的无规律,均匀分布.只是规律非常复杂,对于简单的模型来说就像随机一样.
比如循环节特别长的循环小数.我们一位一位小数遍历过去,要很久才能走完一个循环节.在这段时间内,我们的感觉和遍历一个无理数一样,发现不了什么有价值的规律.一些散列算法反复作用也能产生一些让人摸不着头脑的序列.
这里我们要引入一个"伪随机数种子"的概念.由于我们并非真正在创造随机过程.所以归根结底,我们产生的伪随机数是有规律的.所有的伪随机数都是函数.如果每次都用同一个伪随机序列,很容易被发现规律.所以在产生随机数之前我们要给出一个数值用于产生不同的随机序列.比如每次启动程序根据当前的系统时间选择不同的大循环节的小数.或者不同的散列算法起点.
如果我们需要不同的伪随机序列,就使用不同的随机种子.如果需要多次产生相同的伪随机序列,就使用相同的种子.
使用不同序列好理解.使用相同序列我举个例子:Minecraft的地图就是算法生成的伪随机序列.如果你刷出来一张很好的地图,那么只要和朋友分享地图随机种子就可以.而不需要分享整个地图文件.
Lua提供了一组产生随机的工具.
math.random不带参数调用会返回一个[0,1)区间内的随机数.它有两个可选参数,用于指定随机变量的上下界(必须是整数).如果上下界分别是n,m则会返回[n,m]区间中的整数随机数.如果只给出一个参数,默认下界为1.例如:
math.random(3,5) math.ramdom(5)
如果想设置随机种子math.randomseed.例如:
math.randomseed(12) math.random() math.random() math.randomseed(12) math.random() math.random()
暂无