如何用乙個1 8隨機生成器製作乙個1 7隨機數生成器?

時間 2021-05-30 17:36:22

1樓:草如花

先找 rand1() , [0-1]

rand1rand8() - 1) / (8 - 1) 。

rand7() = rand1() * (7-1) + 1。

擴充套件開來。

已知randN = [L , N] ,求 randM = [K,M]方法:先找 rand1() , [0-1]rand1 = (randN - L) / (N - L)randM = rand1 * (M - K) + KrandM = (randN - L) / (N - L) * (M - K) + K。

2樓:大尾巴狼

直接用rand8的結果(e.g. 0,1,2,...,7),如果出現那個rand7結果以外的(7)。再繼續執行一次。

這是乙個拉斯維加斯演算法。期望執行次數為 8/7

不用擔心它永遠不會結束,因為現實情況它一定會結束

這裡介紹一下隨機演算法的概念

隨機演算法無外乎兩種情況,拉斯維加斯演算法和蒙特卡洛演算法。兩者可以相互轉化

拉斯維加斯演算法是保證執行結果,不保證執行時間。蒙特卡洛演算法是保證執行時間,不保證是否fail。

以本題目為例子。拉斯維加斯演算法如我所描述。蒙特卡洛演算法則為 0 - 6 結果使用,7出現直接算作Fail

拉斯維加斯演算法到蒙特卡洛演算法的轉化為用乙個截止時間,超時Fail。

蒙特卡洛到拉斯維加斯算罰轉化為,只要Fail,就重做。

3樓:

首先,上面答案所說的「遇到8就重取,直到出現1~7」這個方法是可以的,標準的Acceptance-Rejection method

其次,關於用這個方法的最大效率,我們要先定義「效率」,即「每生成乙個rand7需要rand8的期望次數」,這個數越小越好(當然我們可以用這個數的倒數,效率應該越大越好嘛),所以就像高票答案裡提到的(@lixin liu 算錯了,他的boundary好像也錯了,應該是0.93578...),這種方法的效率是8/7=1.

143接下來是我的改進方案:

一次性用rand8生成n個1~8的隨機數,並用它們產生m個1~7的隨機數。為了保證rejection method可以用,我們有

那麼此時的效率就是

例如m=16, n=15時,效率=0.993

又或者m=3535, n=3308時,效率=0.9360

再或者m=8892, n=8321時,效率=0.9358, 很接近boundary了,n,m繼續增加還會有更接近的解

ps:這是個integer programming的問題,我太菜了不會求,但是如果m,n可以不是整數,上述問題變成了minimization with linear constraint,那麼可以證明在不等式條件取等號時我們有,此時效率,即最高效率的情況(不會資訊理論,求指教)

4樓:

碰到8重新抽樣,或者搞個轉盤

轉盤上只有0-6

每次隨機出來的數都是指標撥動的次數

把隨機值往往當前值上加。

應該是均勻的吧(滑稽

5樓:林彼方

1. 建立乙個長度為8的陣列。初始值為[1, 2, 3, 4, 5, 6, 7, 空],指標指向最後的位置。

2. 如果rand8抽到1~7,就輸出這個數,並存入陣列,然後將指標右移。陣列滿了之後就從第乙個開始迴圈替換。

3. 如果rand8抽到8,就再呼叫一次rand8,結果是幾就輸出陣列中第幾個數。

如果一開始就抽到8……就重抽吧( . )

6樓:

遇到8重取

期望1*7/8+2*1/8*7/8+3*1/8*1/8*7/8+....=1+1/8+1/8*1/8+1/8*1/8*1/8+...=8/7

對於這個問題,已經足夠小了,沒有必要繼續想了。

7樓:幹驢

能隨機生成1-8就相當於能隨機生成0或1(1-4對應0,5-8對應1),所以換句話說就是,拋有限次硬幣,得到乙個1/7的概率。應該不可能吧,畢竟1/7不能用二進位制準確表示。

8樓:王贇 Maigo

為敘述方便,設rand8等概率地產生0~7的隨機整數,我們想要用它製造乙個rand7,等概率地產生0~6的隨機整數。

效率最高的方法如下:用rand8反覆生成0~7的隨機數,把它們連起來看作乙個八進位制純小數。把這個純小數轉換成七進製,以它的各位數作為rand7的輸出。

每能確定七進製小數的一位數,就輸出一位數。

從長遠來看,這種方法輸出一位0~6的隨機數,需要消耗log(7)/log(8)位0~7的隨機數,資訊利用率為100%。之所以能做到這一點,是因為產生上一位隨機數時沒有用完的資訊,被用在了下一位隨機數的產生中。

上面的分析沒有考慮運算誤差。輸出一位數所需的時間沒有上限,但無限執行下去的概率為0。這也是已有答案中的各種方法的共同點。

9樓:

ROLL(1-8)7次,計算隨機的數字的次數,有多個數字出現次數相同,則輸出先出現的數字的次數。

如果我ROLL到7次1,那麼就輸出7,如果所有數字都不同,則輸出次數1.

10樓:

我認為最高效的方法就是取到8重來,如果「高效」不排斥發生的概率是0的死迴圈的話。

理由:平均執行次數=8/7次。[同志們這是多少?幾乎就是一次搞定阿]

100%的概率在有限次內完成。

11樓:

抽到8重抽,是可行的。

從實際情況出發嘛,連續100次抽到8的概率是。這個概率大約是 分之一。而根據艾丁頓數估計,整個宇宙中,大概只有個原子。

12樓:

抽到 8 重抽。這個方法有人指出這種 rejection sampling「不能保證有限步數內結束」。

於是有個改進方案:

每生成一次 [1, 7] 內的結果,在輸出的同時也把它丟到熵池裡去。如果抽到 8 的話,就用那個熵池來生成乙個 [1, 7] 之間的隨機數(雖然感覺這樣相當於完全重寫了乙個 rand7 的樣子)。

13樓:Asterisk

import

random

random

.seed

(int(''

.join

([str

(rand8

())foriin

xrange(8

)])))

rand7

=lambda

:random

.randint(0

,7)當然是用從低質量隨機源生成高質量隨機數的一般方法啊(光速逃

14樓:Richard Xu

@Eidosper 的求和只寫了一次,應該是typo吧……實際上 @D Flip Flop的方法(累加n次並對7取餘)和 @小科的方法(取n次,若n次都為8則強行輸出1)是等價的。

證明:顯然。

……這個逼是我掉的我裝完就走……

證明:因為每次累加都使得有乙個數的概率比其它6個數高一點,第1次累加後這個數為1,第2次累加後這個數為2,依此類推。第一次累加時高出的部分是1/8,由歸納法,若第n-1次時高出的部分是,即

有6個數的概率為,有1個數的概率為,

那麼第n次後高出的部分為

這恰好就是「出現n次8後強行輸出這個數」這一做法給這個數所增加的概率。

既然等價那收斂性就沒問題了,因為 @小科 的做法誤差顯然是收斂的

15樓:Dylan

首先題目肯定要求的是隨機分布。

1-8的隨機丟掉8來當作1-7的隨機發生器用,沒有任何問題,任何乙個取值概率都是相同的,不過不能加和到1罷了。

再來看用1-7來構造1-8的隨機數生成器,用兩個1-7發生器構造乙個1-49的發生器(想像7*7的二維陣列),丟掉49,現在你能隨機均勻的得到1~48,再對8求餘就行了。

之前小結了一點

16樓:王鐵匠

這個題目讓我想起了,以前有乙個關於生女孩生男孩的事情國家只允許生一胎,但有些人希望要男娃,所以他們會B超鑑定男女,如果發現懷的不是男娃,就重新懷。針對這個情況,國家出乙個規定,允許如果生下來不是男娃,那麼就可以繼續生,直到生下還在孩子是男娃為止。假設生男娃女娃概率都是5-5,那麼按照這個政策最終男女比例是多少?

自己算根據這個思路,本體解法

rand8():

pass

rand7():

while(1):

c=rand8()

if(c<8return c

17樓:每半年改一次

如果一定要是嚴格等概率分布的話,本質上都要靠出現8時重新產生隨機數直到產生1-7之間的,不可能保證在給定步數內結束,因為產生n次1-8隨機數的sigma域裡沒有概率為1/7的事件。

如果要近似的話,可以在連續產生m個8後強行輸出1,這樣誤差是(1/8)的m次方。

python如何生成乙個序列,是隨機仍20次骰子組合的序列,並把連續相同的打上括號?

python如何生成乙個序列,是隨機仍20次骰子組合的序列,並把連續相同的打上括號?比如這樣 1 2 5 5 3 1 2 4 3 2 2 2 2 3 6 5 5 6 3 1 解答的思路 核心思想是先生成二十次結果,然後遍歷一遍這個結果陣列,找到重複數字的下標範圍。把每一次遍歷中的結果都儲存到乙個結果...

如何評價乙個偽隨機數生成演算法的優劣?

Sisi H 本來是來這裡看看能不能幫我完成作業的,看了看發現我老師說得還挺全的。截老師的三張ppt 王建新 NIST SP800 22中規定了隨機數隨機性測試方法,共16個測試項,必選項15個,是國際上比較權威的測試方法,國密局的隨機數測試規範也參考了這個標準。按照此標準測試有開源的測試工具 st...

計算機隨機生成乙個數是不是真的是隨機的?

逐龍 你這個問題其實跟計算機沒關係了,跟物理時空才有關係,這個已經不是計算機範疇了。你這其實是問世界能不能回到時空都一樣的瞬間,還有你這兒的歷史也已經不是指歷史,而是指時空,因為我們一般的歷史要求就是大事件沒變化就是歷史沒變化。另外,量子世界狀態目前科學認為是具有隨機性質的。 疋召 隨機本身就沒有乙...