iT邦幫忙

0

C#如何真亂數?

c#

小弟公司最近在辦抽獎
用Random()來寫亂數
試跑發現重複率超高...

請問怎麼真亂數?

看更多先前的討論...收起先前的討論...
https://dotblogs.com.tw/stanley14/2016/09/11/153133 這邊有幾種方法 GUID 不是最佳方法,內文請參考
不管哪一種語言,沒有絕對亂數,因為不管如何都要靠亂數種子來產生亂數的
tlf63319 iT邦新手 5 級 ‧ 2018-03-09 17:58:50 檢舉
謝謝大大我看看
weiclin iT邦高手 4 級 ‧ 2018-03-09 19:27:08 檢舉
可以考慮用 https://www.random.org/ 的 api
froce iT邦高手 1 級 ‧ 2018-03-10 09:55:45 檢舉
抽獎不是應該用取出不放回?會有重複的問題嗎?

1 個回答

3
暐翰
iT邦大師 3 級 ‧ 2018-03-09 17:25:18
最佳解答

回答:

個人習慣
運用Guid"極度難重複特性"取亂數
加上LINQ的簡潔
"一行代碼"達到亂數目的

範例:

//測試樣本
var list = new List<int>();
for (int i = 0; i < 1000; i++)
    list.Add(i);

//運用NewGuid極度難重複特性取亂數
var random_list = list.OrderBy(i => Guid.NewGuid()).ToList();

結果:

tlf63319 iT邦新手 5 級 ‧ 2018-03-09 17:37:55 檢舉

謝謝好很多

fysh711426 iT邦研究生 4 級 ‧ 2018-03-09 18:34:08 檢舉

真的沒想過用Guid取亂數,這樣好簡潔
/images/emoticon/emoticon32.gif

想請教您是怎麼知道或想到這個方式的呢?

另外可以麻煩你說明一下這個方法的運作原理嗎@_@?
我試了一下把OrderBy(i => Guid.NewGuid())代換成OrderBy(i => Random.Next(1,100))也是可以Work的,效果也還算不錯

我不懂的點是..Lambda應該是將 => 左邊的值傳入右邊當參數
但這個寫法右邊沒有出現i,所以應該只是省略掉?
我試了OrderBy(i => i = Guid.NewGuid())結果也一樣

我猜測這個寫法是把List中每個位置賦予一個值,再用這個值來比大小嗎?試了Random.Next(1,3)),發現拿到1跟拿到2的各會分一區,但各區的順序還是一樣由小而大,所以每個List的欄位應該都只拿到一次用來當索引的亂數值。

但我從MSDN看不出來可以印證我想法的資料,越看越不懂這個方法是怎麼work的@_@

我要發表回答

立即登入回答