作者stonehomelaa (cousin)
看板C_and_CPP
标题Re: [心得] 朴克牌13支
时间Fri Jul 21 17:52:52 2006
※ 引述《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
1F:推 drkkimo:说到一个重点了 07/21 18:28
2F:推 uqljnro:为何机率分布会错,能否用例子说明 07/21 23:19
3F:推 llama:因为後面的元素没必要与前面已决定好的数字对调.... 07/22 00:12
4F:推 llama:应该是说不能与前面的数字对调...(应该吧) 07/22 00:15
5F:推 llama:j = rand() % (52-i); 07/22 00:27
※ 编辑: stonehomelaa 来自: 220.130.83.81 (07/22 01:11)
6F:推 stonehomelaa:第二个打错了 已更正XD 07/22 01:11
7F:→ stonehomelaa:一个是取後不放回 一个是取後放回 07/22 01:16
8F:→ stonehomelaa:可能是这样吧?? 07/22 01:17
9F:推 ottokang:这样比较可以模拟正确的洗牌方式 07/22 05:04