随机种子

来源:互联网 发布:英国一等荣誉学位知乎 编辑:程序博客网 时间:2024/04/25 14:06

多数使用随机数的计算器都有一个输入端叫做种子。因此种子是用来干什么的?为什么你试图改变它?你如何知道将它改变成什么?

首先说说随机。随机是计算的一个问题,如果你输入相同的命令将总是以相同的结果终止。使用数学计算器产生真实的随机数这在数学上被证明是不可能的,但是生成虚拟的随机数字相当容易。这对于伪随机数来说不是个坏消息,不像真实的随机数字,它们可以被多次重复生成,你每次都将得到相同的随机数。可以按要求生成相同的随机数增加了这些数字序列的可靠度,反过来也让这些数字更简单被使用。

伪随机数是带有明确特征的数字,明确一点就是当我们谈论随机数时我们确实是在谈论数字。单个复数很容易生成,用门罗漫画的形式表现出来:(xkcd由兰德尔.门罗所绘制的网络漫画)
因此定义伪随机数的这些特征是什么呢?可能并非十分正确,我总结了如下两点:

    生成数字的序列本身并不可复制。    序列中的数字应该被平均分配到数字域中。

大量不同的算法有些比其他好,有些比其他快,有些可以解决特殊问题然而其他的却只能解决一般问题。GH中的运算法是基于DonaldKnuth的减法法则的标准微软.NET随机。

So let’s imagine wewant random integers between 0 and 10. What would a bad randomsequence look like?

因此想象一下我们想要得到从1到10的随机整数。不好的序列会是怎样的呢?

§ 3 3 3 3 33 3 3 3 3 3 3 3 3 3 3 3 3 3 3 (about as bad as it gets)

§ 0 1 2 3 45 6 7 8 9 0 1 2 3 4 5 6 7 8 9 (not random at all)非随机

§ 1 3 2 5 39 1 2 4 2 5 1 1 2 8 1 5 2 3 4 (too many low numbers)

§ 2 8 4 6 09 8 2 4 8 6 4 2 2 5 1 4 8 6 2 (too many even numbers)

So what about goodsequences? Well, here’s a few:好的序列是:

§ 6 9 1 2 04 2 8 5 7 2 9 1 9 2 5 3 1 9 2 (sure, why not)

§ 6 2 5 3 41 9 7 8 0 2 1 6 4 5 8 9 5 0 9 (looks about right)

§ 1 8 5 2 34 5 7 9 5 2 1 0 2 1 0 9 7 6 4 (I suppose)

§ 9 0 6 4 83 1 5 2 7 6 1 4 6 0 1 9 7 5 6 (whatever)

这里有许多有效的伪随机序列。因此即使我们有很好的伪随机数生产器,我们仍然可能得到并非完全照我们所想的随机序列。我们需要的序列越短,越有可能出现统计学的越轨使特殊的序列产生。

输入种子值。随机运算器在运行随机序列之前需要一个种子值。这些种子值总是整数,他们可以是任意32字节整数。每次每个单一的种子值导致的是相同的序列。

不幸的是种子和结果之间没有清晰地关系。将种子值从5变为6将导致完全不同的随机序列,两个非常近似的结果也许是相当不同的种子。因此没有方法去猜想一个好的种子值,完全是不断的尝试。同样因为这个完全不连续的性质,你不能使用像Galapagos这样的工具来优化种子值。

如果你寻求有规范特征的伪随机序列,最终可能必须自己编写序列运算法则。关于这个的问题请于GH或VB/C#论坛寻求答案。
结论:种子值是定义伪随机数字精确序列的整数,但是没有方法提前预知序列是多少,也没有办法调整序列仅仅靠改变种子。甚至种子值最小的变化也将导致彻底不同的随机序列。

事实上这并不可能,A限定的所有数字最终经常进行自我复制。
这仅仅对于足够长的序列才正确,短的序列多少允许值的聚集。
原文链接:http://www.grasshopper3d.com/forum/topics/what-are-random-seed-values

一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数,下面介绍两种方法:
一般种子可以以当前的系统时间,这是完全随机的

算法1:平方取中法。
1)将种子设为X0,并mod 10000得到4位数
2)将它平方得到一个8位数(不足8位时前面补0)
3)取中间的4位数可得到下一个4位随机数X1
4)重复1-3步,即可产生多个随机数
这个算法的一个主要缺点是最终它会退化成0,不能继续产生随机数。

算法2:线性同余法
1)将种子设为X0,
2)用一个算法X(n+1)=(a*X(n)+b) mod c产生X(n+1)
一般将c取得很大,可产生0到c-1之间的伪随机数
该算法的一个缺点是会出现循环。

0 0
原创粉丝点击