回覆列表
  • 1 # 矩陣鏈

    從軟體的角度來說,如果是計算機起卦,則要用到隨機數,而電腦中的隨機數是假的隨機數,搞那麼多年程式,我還沒看到過什麼玩意能夠有真隨機數。

    不過可以透過光子糾纏生成隨機數。

    按現代科學定義的真隨機數的產生條件有起碼兩個:

    1、真隨機數數列是不可預計的,因而也不可能重複產生兩個相同的真隨機數數列。

    2、真隨機數只能用某些隨機物理過程來產生。例如:放射性衰變、電子裝置的熱噪音、宇宙射線的觸發時間等等。

    在計算機中,為了滿足資訊熵的特性,常常是用到的資訊源包括使用者的人為反應或某種經過排列變形後的高頻時鐘的序列或者是使用者運動滑鼠的路徑的座標等,這在一般的程式裡據我看是很少觸及到的。因此,計算機上的起卦方法先不談真隨機數的如何的處理問題,還有取到了數又該如何變化的問題。如果更深化的話,還需要要論及世界的本質之類的哲學命題,暫且不表。就目前起卦程式主要在網上起而言,關聯於時間的起卦法也許還有可商議之處,而對隨機要求性較強的起卦方法是很不適合的。

    1. 如何產生一定範圍內的隨機數?

    直接的方法是:

    rand() % N;

    返回從 0 到 N - 1 的數字。但這個方法不好,因為許多隨機數發生器的低位位元並不隨機。一個較好的方法是:

    (int)((double)rand() / ((double)RAND_MAX + 1) * N);

    如果你不希望使用 double,另一個方法是:

    rand() / (RAND_MAX / N + 1);

    兩種方法都需要知道 RAND_MAX,而且假設 N 要遠遠小於 RAND_MAX。ANSI 規定標準標頭檔案 stdlib.h 中包含 RAND_MAX 的 #define。順便提一下,RAND_MAX 是個常數,它告訴你 C 庫函式 rand() 的固定範圍。你不可以設 RAND_MAX 為其它的值,也沒有辦法要求 rand() 返回其它範圍的值。如果你用的隨機數發生器返回的是 0 到 1 的浮點值,要取得範圍在 0 到 N - 1 內的整數,只要將隨機數乘以 N 就可以了。

    2. 為什麼每次執行程式,rand() 都返回相同順序的數字?

    你可以呼叫 srand() 來初始化偽隨機數發生器的種子,傳遞給 srand() 的值應該是真正的隨機數,例如當前時間:

    #include <stdlib.h>

    #include <time.h>

    srand((unsigned int)time((time_t *)NULL));

    請注意,在一個程式執行中多次呼叫 srand() 並不見得有幫助!不要為了取得“真隨機數”而在每次呼叫 rand() 前都呼叫 srand()!

    3. 我需要隨機的真/假值,所以我用直接用 rand() % 2,可是我得到交替的 0, 1, 0, 1, 0 。

    這是個低劣的偽隨機數生成器,在低位位元中不隨機!很不幸,某些系統就提供這樣的偽隨機數生成器。請試著使用高位位元,具體請參考本文第 1 點。

  • 中秋節和大豐收的關聯?
  • 民俗的文化功能有哪些?