Re: [心得] 樸克牌13支

看板C_and_CPP (C/C++)作者 (cousin)時間18年前 (2006/07/21 17:31), 編輯推噓7(702)
留言9則, 5人參與, 最新討論串2/3 (看更多)
※ 引述《papalun (謎樣人物)》之銘言: : for (i=0;i<52;i++) : { : j=rand()%52; : temp=A[i]; : A[i]=A[j]; : A[j]=temp; : } 本來我也認為打亂陣列是這麼做的 不過之前看了深度學習C++網站上的試讀章節 裡面範例有提到兩種做法 其一是陣列元素由後往前與其前的隨機位置對調 for (i = 52 - 1; i > 0; i--) { j = rand() % (i+1); if(i == j) continue; temp = A[i]; A[i] = A[j]; A[j] = temp; } 另一個是由前往後與剩餘元素對調,但最後一個不須再對調 for (i = 0; i < 52 - 1; i++) { j = rand() % (52-i); if(j == 0) continue; temp = A[i]; A[i] = A[j]; A[j] = temp; } 而書上說原po的做法會造成錯誤的機率分佈 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.83.81

07/21 18:28, , 1F
說到一個重點了
07/21 18:28, 1F

07/21 23:19, , 2F
為何機率分佈會錯,能否用例子說明
07/21 23:19, 2F

07/22 00:12, , 3F
因為後面的元素沒必要與前面已決定好的數字對調....
07/22 00:12, 3F

07/22 00:15, , 4F
應該是說不能與前面的數字對調...(應該吧)
07/22 00:15, 4F

07/22 00:27, , 5F
j = rand() % (52-i);
07/22 00:27, 5F
※ 編輯: stonehomelaa 來自: 220.130.83.81 (07/22 01:11)

07/22 01:11, , 6F
第二個打錯了 已更正XD
07/22 01:11, 6F

07/22 01:16, , 7F
一個是取後不放回 一個是取後放回
07/22 01:16, 7F

07/22 01:17, , 8F
可能是這樣吧??
07/22 01:17, 8F

07/22 05:04, , 9F
這樣比較可以模擬正確的洗牌方式
07/22 05:04, 9F
文章代碼(AID): #14m9xY_r (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #14m9xY_r (C_and_CPP)