Bor*_*lik 21
还有这个算法:

哦,更严肃的是:
随机数生成器使用数学公式将数字集转移到另一个数字公式.例如,如果你取一个常数N和另一个数n_0,然后取n mod N(模数运算符)的值,你将得到一个新数字n_1,看起来与它无关n_0.现在,重复相同的过程,n_1你会得到另一个数字.你在这里有一个看似随机数的(很糟糕)发生器.
请记住,我在这里描述的方法是一种玩具方法,不应该用于任何严肃的事情.但是,它确实说明了一般原则.
另请注意:
如果所有科学论文的结果都因为不好而
rand被怀疑都会从图书馆的书架上消失,那么每个书架上都会有一个与你的拳头一样大的空隙.
(从数字食谱的第7章开始).对于任何使用随机数生成器进行任何认真工作的人来说,这是必读文本.
Mic*_*ngh 18
要记住的一件事是没有"真正的"随机数生成器.他们刚刚生成的数字看起来随机给我们凡人.
其中一个最简单的例子(也是实现)是线性同余生成器.当然,这些数字看起来对你和我来说都是不可预测的,但它们实际上是在有限的场内均匀分布的.
当然,像Blum Blum Shub这样的一些发生器即使他将严格的数学技能和计算能力应用于任务也无法预测局外人,但从根本上说,随机数发生器不是随机的; 他们是有规律和可预测的.
我过去如何制作它们的方法是从系统中获得一些真正快速变化的值,例如系统毫秒计时器.
接下来你需要做的是应用一些公式,从这个"输入"数字生成一个新数字并将其剪切到你需要的范围,例如0..255:
random_number =整数(公式(计时器值))MOD 255
这样,每次调用该函数时都会有一个新的"随机"数字.
一个示例公式函数可以是:
公式(x)=((x XOR常数)+ constant2)MOD范围
XOR曾经是我的最爱之一.
更新:我意识到这个公式非常糟糕,它会生成一组非常可预测的数字.此外,系统计时器太可预测为源.因此对于大多数应用来说,这还不够.如果您需要更好的随机性,请使用更多来源,而不仅仅是系统计时器和更好的公式来组合它们.
我找到了这个适用于 Java 的:
http://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml
通过谷歌搜索随机函数如何工作java
我确信答案是特定于语言的,但您可以尝试根据您选择的语言更改我的 Google 查询。