【问题标题】:How to fill array with specific number of 1's and 0's in random locations?如何在随机位置用特定数量的 1 和 0 填充数组?
【发布时间】:2018-04-04 09:08:11
【问题描述】:

我有一个数组,其中有 8 个点要填充,4 个点和 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--;
    }
  }
}

这主要是可行的,但有一些明显的缺点,所以任何关于更好方法的指针都将不胜感激。

【问题讨论】:

  • 我可能会将数组设置为 [1,1,1,1,0,0,0,0] 然后随机播放。随机选择两个元素并交换它们几次。
  • 这不是一个坏主意,我一定要考虑一下,这绝对是一个不错的选择。
  • @Octopus 的建议可以be performed for you by std::shuffle.

标签: c++ arrays sorting random arduino


【解决方案1】:

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

对于资源紧张的 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;
  }

}

This is exactly how the std::shuffle function is implemented,仅受限于 Arduino 内置random() 函数实现的有效性

【讨论】:

  • 这种“幼稚”的 shuffle 实现不会产生等概率的排列。 OP 并未声明他们希望不同排列的均匀分布,但这通常是隐含的。如果是这样,这个解决方案甚至是遥不可及的。
  • AnT 是对的。这是一个非常好的主意,但实施存在缺陷。使用std::shuffle,我相信即使在 Arduino 上也应该可用。
  • @Adrian,即使交换次数增加?我想看看这方面的证据。
  • @Octopus:我相信本节的第二段涵盖了它。 en.wikipedia.org/wiki/…
  • @Octopus:增加“naive” shuffle 中的迭代次数(即用 randN 交换 rand 次)当然会平衡分布。但是,为了实际目的完全平滑它,您将需要超过 8 次迭代。同时经典的 Knuth shuffle 只需要 8 次迭代即可产生完全均匀的分布,这立即使“幼稚”算法变得毫无意义。
【解决方案2】:

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

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

在您的情况下,您需要在 8 个元素的数组中设置 4 个随机 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) &lt; m 方法。当然,这不是重点。您可以使用您选择的任何其他方法。

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 2022-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2017-03-22
    • 2018-04-21
    相关资源
    最近更新 更多