gpt4 book ai didi

c++ - 费舍尔耶茨变例

转载 作者:可可西里 更新时间:2023-11-01 15:24:59 27 4
gpt4 key购买 nike

经典的 Fisher Yates 看起来像这样:

void shuffle1(std::vector<int>& vec)
{
int n = vec.size();
for (int i = n - 1; i > 0; --i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}

昨天,我错误地“向后”实现了迭代:

void shuffle2(std::vector<int>& vec)
{
int n = vec.size();
for (int i = 1; i < n; ++i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}

这个版本比第一个版本更糟(或更好)吗?它会扭曲结果概率吗?

最佳答案

是的,假设 rand() 是均匀分布。我们将通过证明每个输入可以等概率生成每个排列来证明这一点。

N=2 很容易证明。 我们将把它画成一棵树,其中的子节点代表您可以通过将逗号后的字符插入最左边的字符串来获得的每个字符串。

  0,1   //input where 0,1 represent indices
01 10 //output. Represents permutations of 01. It is clear that each one has equal probability

对于 N,我们将有 N-1 的所有排列,并随机交换 N 的最后一个字符

    (N-1 0th permutation),N     .....          (N-1 Ith permutation),N ________________________  
/ \ / \ \
0th permutation of N 1st permutation.... (I*N)th permutation ((I*N)+1)th permutation .... (I*N)+(I-1)th permutation

这种糟糕的归纳法应该会导致它均匀分布。


例子:

N=2:

  0,1
01 10 // these are the permutations. Each one has equal probability

N=3:

           0,1|2           // the | is used to separate characters that we will insert later
01,2 10,2 // 01, 10 are permutations from N-1, 2 is the new value
210 021 012 201 120 102 // these are the permutations, still equal probability

N=4:(弯曲以帮助阅读)

                                                           0,1|23

01,2|3 10,2|3

012,3 021,3 210,3 102,3 120,3 201,3

0123 0132 0321 3230 2013 2031 2310 3012
0213 0231 0312 3210 1203 1230 1302 3201
2103 2130 2301 3102 1023 1032 1320 3021

等等

关于c++ - 费舍尔耶茨变例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8861568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com