2017-02-28 41 views
1

每次調用random()方法時,是否需要更改隨機種子?需要在調用random()方法時更改隨機種子?

或者應該生成一個隨機種子,直到重新啓動我的程序才能更改?

哪個選擇可以得到更好的隨機數?

關於我的程序

我發展與Node.js撲克程序。我需要洗牌Math.random()

由於原創原創Math.random()方法不夠安全,所以我用seedrandom包重寫了它。

我可以提供一個隨機種子seedrandom。但是我不知道何時需要更改或需要在程序運行時更改隨機種子。

+2

除非您正在製作自己的僞隨機生成器,然後種子會在'random()'方法內自動更改。如果種子不變,那麼你需要另一個臨時變量使種子本身無用 – Spektre

+0

你的目的是什麼,你的計劃是什麼?你應該指出他們繼續你的問題。 – HappyHal

+0

我已經添加了一些關於我的程序的消息。謝謝 – sjfkai

回答

0

使用常量隨機種子在開發時非常有用 - 它允許您持續的行爲,這意味着每次運行程序時都會出現一個bug。

測試時 - 您可以生成隨機種子作爲參數,如果程序崩潰重新創建錯誤。

在現實世界的應用程序中,您不能擁有一個常量隨機種子,因爲它會使整個程序常量爲。在你的撲克遊戲中,正在處理的牌將永遠是相同的,你可以理解這可能是一個問題。對於在每次隨機()調用之前生成一個新的種子,僞隨機生成器用於創建儘可能真正的隨機變量,真隨機意味着一旦你得到一個系列,你就不能預測下一個數字以前的數字。所以每次改變種子都沒有任何意義。

+0

謝謝。如果我在撲克程序啓動時生成隨機種子(不是常量,如時間戳)。只有在程序重新啓動時才更改種子。會有什麼問題嗎?換句話說,我能用一個隨機種子產生無數的隨機數嗎? – sjfkai

+0

@sjfkai,如果您使用種子的時間戳,您將無效所有努力找到一個安全的RNG。我對Node.js一無所知,但它看起來像需要用[crypto.randomBytes(256)](https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback)(或[ (https://en.wikipedia.org/wiki/Fisher-Yates#Pseudorandom_generators:_problems_involving_state_space.2C_seeding.2C_and_usage))來洗牌一張52張牌。你可以在同一個加密類中尋找一個可靠的CPRNG。 – sh1

0

所以你問的是隨機安全呢?

在這種情況下,它是完全不同的問題。

使用固定僞隨機函數作爲隨機源始終包含輸出可能具有可被潛在的黑客/作弊者利用的確定性屬性的風險。例如卡一些序列之後,遊戲會重複自我等等

有一些事情可以做,以防止或降低這種風險:

  1. 使用隨機生成

    這種方式是最安全的,但在大多數情況下不可用,因爲您需要一個真正的隨機性來源(如天線或某些傳感器獲取白噪聲等),這需要非標準硬件,而大多數機器都不存在這種硬件。

  2. 隨機化時不時

    所以一段時間後,經過嘗試隨機你的後裔(這是你問)。通常使用一些更好的隨機變量來提高隨機性,如使用實時,等等來衡量人的響應時間(密鑰保持多久或平均點擊率等)。

    這樣您應該更改種子在某些飽和或隨機時間段過去之後,可以預測輸出的某些屬性。

  3. 使用一個以上的僞隨機數發生器

    如果你有更多的發電機可以隨機時間它們之間進行切換,以時間甚至更低的風險。你也可以用另一臺發電機計算一臺發電機的種子。

  4. 非恆定的隨機調用頻率

    如果在每一幀不斷隨機電話/轉什麼,然後你有更高的概率,你的應用程序將「飽和」或重複自我。爲了降低風險,您可以將隨機值加上空的隨機呼叫。

檢查隨機性是使用2D gfx的好主意。您可以輕鬆檢測圖案和飽和度,以便估計您應該隨機抽出的頻率。例如,這樣的情節看:

同樣採用直方圖有助於看到輸出的質量。 (定製發生器上的某些種子可能會導致丟失數字或分發缺陷)