Re: [問題] 平均的亂數產生數字個數 C++

看板C_and_CPP作者 ( 苦海釣叟)時間12年前 (2012/04/28 01:05), 編輯推噓1(1010)
留言11則, 4人參與, 最新討論串1/1
※ 引述《bernachom (Terry)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC++ : 問題(Question): : 請教一下 : 我要產生四個數字1, 2, 3, 4 : 是採用亂數產生的方式,最少1個,最多4個 : EX: 1+rand()%(4); : 如果我要產生100個,那每個數字就會出現25次(100/4 =25) : 90個的話,那每個數字就會出現22.5次(進位變23次) (90/4 = 22.5) : 80個的話,每個數字就對出現20次 (80/4 =20) : 我目前的想法是用四個變數各別存下這幾個數字 : 產生過的就加一 : 然後再加上if的判斷 : 如果超過所需要的次數,就不會再產生了 : 但是這樣子方法效率似乎有點差... : 每產生一個數字就要做一堆判斷 : 想詢問前輩們,不知道有沒有比較聰明的方法 : 謝謝指導了。 先準備一個 array 個數為你要的個數 依序重覆填入 1,2,3,4 利用亂數種子取得這次的 array index 得其值後 將之與這個 array 最後一個有效的 index 互相交換其值 並將 有效的個數減一 並利用亂數種子取得範圍內的 index ... 當有效的個數為 1 時 則你需要的亂數序列就完成了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.106.49

04/28 01:11, , 1F
謝謝,我想一下,感謝
04/28 01:11, 1F

04/28 08:29, , 2F
這就是洗牌吧?隨便選兩個數字調換就好
04/28 08:29, 2F

04/28 17:09, , 3F
洗牌要好好洗啊 隨便選兩個數字調換會洗得不夠亂喔
04/28 17:09, 3F

04/28 17:42, , 4F
或是亂數取,取過得就不要再取,這樣也可以吧(?
04/28 17:42, 4F

04/28 18:20, , 5F
還是不行 XD 你可以去計算每個元素出現在每個位置的機率
04/28 18:20, 5F

04/28 18:20, , 6F
要都是相等的才行 基本上這篇文做法是最標準的了
04/28 18:20, 6F

04/28 18:21, , 7F
唔, 我說錯了 應該是去計算每種排列出現的機率
04/28 18:21, 7F

04/28 18:22, , 8F
這個要全部相等 (都是 1/(n!)) 才行
04/28 18:22, 8F

04/28 21:26, , 9F
還是不太懂Orz下次在研究...
04/28 21:26, 9F

05/01 14:53, , 10F
STL不是本來就有洗牌的函數嗎? random_shuffle
05/01 14:53, 10F

05/01 14:54, , 11F
http://ppt.cc/LoqQ 請include algorithm
05/01 14:54, 11F
文章代碼(AID): #1Fcj7Wg3 (C_and_CPP)