随机种子
多數使用隨機數的計算器都有一個輸入端叫做種子。因此種子是用來干什么的?為什么你試圖改變它?你如何知道將它改變成什么?
首先說說隨機。隨機是計算的一個問題,如果你輸入相同的命令將總是以相同的結果終止。使用數學計算器產生真實的隨機數這在數學上被證明是不可能的,但是生成虛擬的隨機數字相當容易。這對于偽隨機數來說不是個壞消息,不像真實的隨機數字,它們可以被多次重復生成,你每次都將得到相同的隨機數。可以按要求生成相同的隨機數增加了這些數字序列的可靠度,反過來也讓這些數字更簡單被使用。
偽隨機數是帶有明確特征的數字,明確一點就是當我們談論隨機數時我們確實是在談論數字。單個復數很容易生成,用門羅漫畫的形式表現出來:(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之間的偽隨機數
該算法的一個缺點是會出現循環。
總結
- 上一篇: 用小程序·云开发两天搭建mini论坛丨实
- 下一篇: java concurrent 锁_ja