作者tomin (藍藍紫黃橘 粉灰白綠咖)
看板Ajax
標題Re: [問題] random設定範圍、最小(大)值
時間Tue Feb 8 17:48:12 2011
※ 引述《s25g5d4 (死城盜賊)》之銘言:
: js裡的Math.random()返回的是介於0~1之間的亂數
: 沒有原生的範圍設定與最小(大)值
: 我的做法是直接把random產生的數乘上範圍數量
: 然後無條件捨去 在加上最小值
: 這樣寫可以嗎?
: Math.floor( Math.random() * (max - min + 1) ) + min;
: 這樣在結果上會不會有分配不均的可能性?
: 就是某個數被選中的機率會偏高
這個寫法很標準 我測是很平均
兩筆(隨機產生數字1或2)時:
http://www.jsfiddle.net/Lr2W9/
sampleNum: 4, sampleSize: 1000000
chanceOneCount: 500312
chanceTwoCount: 499688
多筆(隨機產生數字1~7)時:
http://www.jsfiddle.net/N345P/
sampleNum: 3, sampleSize: 100000
No1: 14250
No2: 14326
No3: 14366
No4: 14036
No5: 14252
No6: 14411
No7: 14359
記得看過一篇文章說floor比較有效率? 或是(小數點)進位比較準確?
比起類似的函式如ceil
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.122.76.198
※ 編輯: tomin 來自: 140.122.76.198 (02/08 17:51)
推 s25g5d4:如果用ceil還要 -1 所以我才用floor 02/08 20:39
→ s25g5d4:其實最早的時候我用round 才有此疑問 02/08 20:39
→ s25g5d4:當初真是囧rz 居然用round 然後遇到10就丟給0 統計下來 02/08 20:40
→ s25g5d4:好像還蠻平均的?! 02/08 20:40
推 jtmh:其實這個畫數線分段歸類就可以大概知道了,用 round 的話如原 02/08 22:54
→ jtmh:po 的方法也是行得通,不過缺點是比較不直覺,程式較複雜。 02/08 22:55