Как заполнить массив с определенным числом 1 и 0 в случайных местах?

У меня есть массив с 8 пятнами для заполнения и 4 и 4 нуля, чтобы заполнить его, но хотите, чтобы места были случайными. Я немного зациклен на том, как это сделать, не будучи лишним. Есть ли простой способ сделать это, или мне нужно заполнить массив либо 1, либо ноль случайно, а затем пройти проверку и проверить, имеет ли он правильное число как после факта? Мой текущий код находится в строках

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

Обновление: этот ответ немного изменился с оригинала

Для 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() функция

Ответ 2

Если вам нужно сгенерировать m случайные в массиве нулей, вы можете просто перебрать весь массив и установить текущий элемент в 1 со следующей вероятностью P

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

В вашем случае вам нужно установить 4 случайных 1 в массиве из 8 элементов

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.S. Чтобы принять решение с указанной выше вероятностью P, я использовал часто критикуемый метод rand() % (N - i) < m. Это, конечно же, конечно. Вы можете использовать любой другой метод по вашему выбору.