如何在随机位置用特定数量的 1 和 0 填充数组?

How to fill array with specific number of 1's and 0's in random locations?

本文关键字:填充 数组 随机 位置      更新时间:2023-10-16

我有一个数组,有 8 个点要填充,4 个 1 和 4 个零要填充,但希望位置是随机的。我有点困惑于如何做到这一点而不会变得多余。有没有一种简单的方法可以做到这一点,或者我是否必须随机用 1 或 0 填充数组,然后在事后检查它是否有正确的数量?我当前的代码是这样的

void setup() {
  int one = 0;
  randomSeed(analogRead(A0));
  for (int i=0; i<8; i++){
    array[i] = random(0, 2);
    if (array[i] == 1){
      one++;
    }
    if(one >4){
      array[i] = 0;
      one--;
    }
  }
}

这主要有效,但有一些明显的缺点,因此任何关于更好方法的指针将不胜感激。

更新:这个答案与原来的略有不同

对于资源紧张的Arduino,这段代码就足够了,不需要链接额外的库:

int a[8] = { 0,0,0,0,1,1,1,1 };

void setup() {
  randomSeed(analogRead(A0));
  for (int n=7;n>0;n--) {
    int r = random(n+1);
    int t = a[n];
    a[n] = a[r];
    a[r] = t;
  }
}

这正是 std::shuffle 函数的实现方式,仅受内置 Arduino random() 函数实现的有效性的限制。

如果您需要在

零数组中生成m个随机数组,您可以简单地遍历整个数组并将当前元素设置为 1,概率如下P

           number of 1's that remains to be set
P = ----------------------------------------------------
    number of array elements that remains to be iterated

在您的情况下,您需要在 4 个元素的数组中设置 8 个随机 1

const unsigned N = 8, M = 4;
int array[N];
for (unsigned i = 0, m = M; i < N; ++i)
  if (rand() % (N - i) < m)
  {
    array[i] = 1;
    --m;
  }
  else
    array[i] = 0;

这将一次性生成随机数组 - 无需对任何内容进行后洗牌。

附言为了以上述概率做出决定P我使用了经常受到批评的rand() % (N - i) < m方法。当然,这不是重点。您可以使用您选择的任何其他方法。