boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 关于高德纳的洗牌算法
相关主题
how to shuffle a deck of cards?
srand()的问题
请问一道概率题,谢谢了先
MS电面
问个随机数的问题
问个Shuffle的问题
谁还记得这道面试题吗?
请教个弱题:random generator: from 1~5 to 1~7
今天的G电面面经
关于那个随机数的
相关话题的讨论汇总
话题: parr话题: rand话题: int话题: genrand
进入JobHunting版参与讨论
1 (共1页)
j**l
发帖数: 2911
1
以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
void KnuthShuffle(int pArr[], int n)
{
int rand;
for (int i = n - 1; i >= 0; i--)
{
rand = GenRand(0, i); // including 0 and i
swap(pArr[i], pArr[rand]);
}
}
void KnuthShuffle(int pArr[], int n)
{
int rand;
for (int i = 0; i < n; i++)
{
rand = GenRand(i, n-1); // including i and n-1
swap(pArr[i], pArr[rand]);
}
}
q*********u
发帖数: 280
2
我wikipedia看到一种,说也是他论证过的,给52个牌随机数,每个数的随机数都不
互相相等,如果有和前面的数重复,则重新产生。
最后来一个排序。
wiki上先说的这个,然后再说比一边产生随机数一边交换。

以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
void KnuthShuffle(int pArr[], int n)
{
int rand;
for (int i = n - 1; i >= 0; i--)
{
rand = GenRand(0, i); // including 0 and i
swap(pArr[i], pArr[rand]);
}
}
void KnuthShuffle(int pArr[], int n)
{
int rand;
for (int i = 0; i < n; i++)
{
rand = GenRand(i, n-1); // including i and n-1
swap(pArr[i], pArr[r

【在 j**l 的大作中提到】
: 以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
: void KnuthShuffle(int pArr[], int n)
: {
: int rand;
: for (int i = n - 1; i >= 0; i--)
: {
: rand = GenRand(0, i); // including 0 and i
: swap(pArr[i], pArr[rand]);
: }
: }

q*********u
发帖数: 280
3
好像说是已经交换过的牌不用再交换了。

以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
void KnuthShuffle(int pArr[], int n)
{
int rand;
for (int i = n - 1; i >= 0; i--)
{
rand = GenRand(0, i); // including 0 and i
swap(pArr[i], pArr[rand]);
}
}
void KnuthShuffle(int pArr[], int n)
{
int rand;
for (int i = 0; i < n; i++)
{
rand = GenRand(i, n-1); // including i and n-1
swap(pArr[i], pArr[rand]);
}
}

【在 j**l 的大作中提到】
: 以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
: void KnuthShuffle(int pArr[], int n)
: {
: int rand;
: for (int i = n - 1; i >= 0; i--)
: {
: rand = GenRand(0, i); // including 0 and i
: swap(pArr[i], pArr[rand]);
: }
: }

j**l
发帖数: 2911
4
两种方法都固定已经交换过的牌,只是一个从后向前走,一个从前向后走

【在 q*********u 的大作中提到】
: 好像说是已经交换过的牌不用再交换了。
:
: 以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
: void KnuthShuffle(int pArr[], int n)
: {
: int rand;
: for (int i = n - 1; i >= 0; i--)
: {
: rand = GenRand(0, i); // including 0 and i
: swap(pArr[i], pArr[rand]);

r****o
发帖数: 1950
5
问问,这两种方法里面,是不是可以判断一下,
如果rand刚好等于i,就不用swap了。

【在 j**l 的大作中提到】
: 以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
: void KnuthShuffle(int pArr[], int n)
: {
: int rand;
: for (int i = n - 1; i >= 0; i--)
: {
: rand = GenRand(0, i); // including 0 and i
: swap(pArr[i], pArr[rand]);
: }
: }

y**i
发帖数: 1112
6
为什么要这么取随机数,要包括自己的下标
我觉得rand = GetRand(0, i-1)就已经很好了啊

【在 j**l 的大作中提到】
: 以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
: void KnuthShuffle(int pArr[], int n)
: {
: int rand;
: for (int i = n - 1; i >= 0; i--)
: {
: rand = GenRand(0, i); // including 0 and i
: swap(pArr[i], pArr[rand]);
: }
: }

j**l
发帖数: 2911
7
以从前向后排为例,之所以是GetRand(i, n-1), 要包括i
因为第i号牌最终就放在i号位置不动是n!种全排列包括的
第0号位置可以放n张牌之一
第1号位置可以放(n-1)张牌之一,因为第0号位置固定了一张牌
第2号位置可以放(n-2)张牌之一, 因为第0号位置和第1号位置固定了两张牌
...
第n-1号位置只能放最后剩下的一张牌
所以有n!种放法,不重不漏

【在 y**i 的大作中提到】
: 为什么要这么取随机数,要包括自己的下标
: 我觉得rand = GetRand(0, i-1)就已经很好了啊

l******c
发帖数: 2555
8
从后往前编程方便。
in C++
index = rand()% (i + 1) 即可。
从前往后 就复杂些。

【在 j**l 的大作中提到】
: 以下两种都可以么?为什么他老人家给出的是第一种,从后往前排?
: void KnuthShuffle(int pArr[], int n)
: {
: int rand;
: for (int i = n - 1; i >= 0; i--)
: {
: rand = GenRand(0, i); // including 0 and i
: swap(pArr[i], pArr[rand]);
: }
: }

1 (共1页)
进入JobHunting版参与讨论
相关主题
关于那个随机数的
请教一个随机数,概率相关的问题
请教一道产生随机数的问题
G家onsite 随机数一题
问一个面试题
fancy swap?
java: use vector to shuffle a deck of Card 问题
问个dutch flag
3-way Partition 算法不容易
一个容易记忆的permutation算法
相关话题的讨论汇总
话题: parr话题: rand话题: int话题: genrand