iT邦幫忙

0

C#如何真亂數?

c#
  • 分享至 

  • xImage

小弟公司最近在辦抽獎
用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 檢舉
抽獎不是應該用取出不放回?會有重複的問題嗎?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
暐翰
iT邦大師 1 級 ‧ 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 檢舉

謝謝好很多

真的沒想過用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的@_@

hung19091 iT邦新手 5 級 ‧ 2023-12-01 10:23:59 檢舉

rainbowrain 雖然考古了,使用Random.Next有一個缺點,C#預設亂數種子是[系統時間],如果短時間內大量取亂數,會變成同一個種子(同一秒)取到一模一樣的亂數,導致數字不是完全隨機

我要發表回答

立即登入回答