資料結構與演算法 rand7 生成rand10

2021-09-14 06:34:09 字數 804 閱讀 1712

rand7:隨機生成1-7的數字。那麼如何有rand7構建rand10?

大致思路有兩種:

1 捨棄法

大多數都是這麼叫的。意思是如果有了大的生成小的,可以直接把多與的捨棄掉重新rand。舉個例子,如果有了rand10,如何得到rand7?n=rand10,如果n>7,重新rand10,直到n<=7為止。

該方法的思路:

n=(rand7 - 1) * 7 + rand7,如果n大於40,就重試,直到小於等於40

r=n%10 +1

原理:(rand7 - 1) * 7 + rand7這個式子可以均勻產生1-49。ran7 - 1生成0-6,(rand7 - 1) * 7生成0,7,14,,,42,再加上rand7,範圍是1-49。可以用簡單的做差的方式驗證,對於1-49中任何的數,都不會有兩種生成方式。所以,前乙個rand7和後乙個rand7沒有關係,1-49的數是等概率的。進而1-40的數也是等概率的。

如果是randm到randn呢?

如果m>=n,直接捨棄法;

如果m2 特殊方法

用1-5中每乙個數字代表1-10中的兩個數字,在用6-7決定是兩個中的哪乙個。

3 組合法

使用乙個計數器n,初始值為0。代表次數。

第0次從1,2,3,4,5,6,7中隨機取乙個;

第1次從2,3,4,5,6,7,8中隨機取乙個;

第2次從3,4,5,6,7,8,9中隨機取乙個;

第10次從10,1,2,3,4,5,6中隨機取乙個;

後面再按照這個迴圈來。

這樣每一次雖然不是均勻的,但是隨著次數的增多,整體來說是均勻的。

《資料結構與演算法之1 rand 函式》

1 include stdafx.h 2 include iostream 3 include time.h 用到time null 函式,需要此標頭檔案45 using namespace std 67 int a 100000 8 int b 100000 9 1011 12說明 系統在呼叫ra...

資料結構與演算法筆記7 堆

2.堆的儲存結構 3.最大空堆的建立 4.堆的插入 5.堆的刪除 6.最大堆的建立 全部程式 堆 heap 是用優先佇列 priovity queue 實現的,優先佇列是一種特殊的 佇列 取出元素順序為優先權 關鍵字 的大小,而不是元素進入佇列的先後順序。堆的型別定義 struct hnode ty...

資料結構與演算法7 希爾排序

目錄 希爾排序 基於插入排序 效能比插入排序好,但不穩定 1.簡介 1.1 基本實現 1.2 gap的選擇和位運算優化 gap 一般選 陣列長度1 2 1.3 gap的選擇 1.4 耗時比較 shell knuth序列 效能比sort函式查一倍 特點 間隔大,移動次數少 間隔小移動距離短。比普通插入...