2016-11-04 171 views
1

也有類似的問題,但其中大多數都與語言相關。我在尋找一個通用的解決方案。給定一些方法來產生隨機字節和數字n,我需要產生範圍爲1 ... n(含)的隨機數。在隨機字節的給定範圍內生成隨機數

我已經想出到目前爲止:

  1. 爲了確定表示Ñ所需的字節數,計算

f(n):=ceiling(ln(n)/8ln(2))=ceiling(0.180337*ln(n))

  • 獲取範圍爲的一個隨機數1 ... 2^8f(n)對於0索引字節b [i]:
  • r:=0 for i=0 to k-1: r = r + b[i] * 2^(8*i) end for

  • 擴展到1 ... N無偏差:

    R(n,r) := ceiling(n * (r/256^f(n)))

  • 但我不確定這不會造成偏見或一些微妙的一次性錯誤。你能檢查這個聲音和/或提出改進建議嗎?這是正確的方法嗎?

    在回答中,請假定沒有可用的模塊化位操作,但您可以假設任意精確的算術運算。 (我在Scheme中編程)

    編輯:我的方法肯定有問題,因爲在我的測試中,擲骰子產生了一些0的情況!但錯誤在哪裏?

    回答

    0

    這與您希望從0到1(含)的隨機浮點數生成1到n的數字類似。如果r是隨機浮動:

    result = (r * n) + 1 
    

    如果你有高精度計算,你可以通過在k字節表達的最高值除以你的k字節的整數計算r,+ 1

    所以,如果你有4個字節87 6F BD 4An = 200:

    ((0x876FBd4A/0x100000000) * 200) + 1