但其实上述洗牌是有问题的,存在两个问题:

  1. 没有随机种子。在没有随机种子的情况下,rand.Intn()返回的伪随机数序列是固定的。
  2. 洗牌不均匀。不均匀会导致整个数组第一个节点有大概率被选中,所以多个节点的负载分布不均衡

第一个问题不用多说,简单但容易犯,特别注意即可规避。

第二个问题用概率简单解释。如果每次挑选都是真随机,那么这种洗牌的结果是 77=823543,但我们需要的是每次选中的数字的概率相等,则应该有 7!=5040 种结果,823543 明显不是 5040 的倍数,所以肯定有某个数字以比其他数字更高的概率被选择,所以这种代码是错误的,计算概率的过程很复杂,直接上结论:索引为 0 的元素被选中的概率约为 22%,其他元素被选中的概率约为 13%

最后编辑: kuteng  文档更新时间: 2022-03-22 19:29   作者:kuteng