Как заполнить массив определенным числом 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--;
}
}
}
это работает, но имеет некоторые очевидные недостатки поэтому любые указатели на лучший способ сделать это было бы оценено.
2 ответов
Update: этот ответ немного изменился от исходного
для 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 случайных 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
метод. Это, конечно, к делу не относится. Вы можете использовать любой другой метод по вашему выбору.