給定隨機生成整數1到5的函式,寫出能隨機生成整數1到7的函式
方法1:
rand5()*5+rand5(),得到[6,30]區間內25個數等概率分布
可以只用6~26之間的21個數,對映到1~7這7個數
27~30怎麼辦?拋棄掉
intrand7()
這樣生成的1~7概率均勻,只是其和不等於1
方法2:
用rand5()生成乙個5進製的數
假如有3位,那麼每一位生成乙個rand5(),這個數就是[0,444]上的均勻分布的整數
不過遺憾7不能整除5的冪次方,這樣就無法均分7段
不過如果位數足夠大,則遺漏的概率就會相當的小
類似問題
已知rand1()等概率返回0或者1,試寫乙個函式等概率返回[a,b]之間的整數
用二進位制表示a與b,
得到a的位數,b的位數,
按位生成二進位制數,如果超出了[a,b]範圍則重新生成
(對於上一題,如果隨機數生成器可以生成偶數範圍的話,可以先構造rand1(),之後的問題即為本問題)
類似問題
已知rand7(),球rand10()
這可以轉成第乙個問題:先構造rand7()*7+rand7(),然後過濾,再平分
或者可以把rand7()先轉成rand5()與rand2(),然後組合
intrand10()
while(t1>5
);
dowhile(t2>2
);
return t1+5*(t2-1
);}
推廣:已知randk(),求randn()
用k進製表示n,先求需要多少位,求解m:
k^m-1=nm=int(m)+1
intrandn()
}
理解這類題的關鍵知識:
每一位等概率分布 -> 這個數在整個域上也等概率分布
乙個等概率分布[a,b]的子集合(例如[a+1,b-1])同樣是等概率分布,只是子集合的概率和不為1,但不影響演算法實現
ref:
Lua 隨機數生成問題
lua 生成隨機數需要用到兩個函式 math.randomseed xx math.random n m 1.math.randomseed n 接收乙個整數 n 作為隨機序列種子。2.math.random n m 有三種用法 無參呼叫,產生 0,1 之間的浮點隨機數 只有引數 n,產生 1 n ...
Lua 隨機數生成問題
lua 生成隨機數需要用到兩個函式 math.randomseed xx math.random n m 1.math.randomseed n 接收乙個整數 n 作為隨機序列種子。2.math.random n m 有三種用法 無參呼叫,產生 0,1 之間的浮點隨機數 只有引數 n,產生 1 n ...
Lua 隨機數生成問題
2014 08 27 icecity00.摘自 csdn部落格 閱 131 轉 1 轉藏到我的圖書館 分享 lua 生成隨機數需要用到兩個函式 math.randomseed xx math.random n m 1.math.randomseed n 接收乙個整數 n 作為隨機序列種子。2.mat...