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函式查一倍 特點 間隔大,移動次數少 間隔小移動距離短。比普通插入...