Рандом в двумерном квадратном массиве
Как заполнить массив рандомно только 0, 1 и 3, не взяв при этом 2.
Ответы (7 шт):
как вариант:
создаете массив
const int arr[] = {0, 1, 3}получаете случайное число от 0 до 2 включительно:
const int pos = rand() % 3;получаете нужное значение:
const int value = arr[pos];
так вы получите равномерное распределение между данными числами, причем можно использовать любые последовательности чисел и т.д. - т.е. более универсальное даже решение, чем вы требуете
Ну типа
int val[3] = {0,1,3};
for(int i = 0; i < строк; ++i)
for(int j = 0; j < столбцов; ++j)
a[i][j] = val[rand()%3];
или, без массива:
for(int i = 0; i < строк; ++i)
for(int j = 0; j < столбцов; ++j)
{
int n = rand()%3;
a[i][j] = n*(n+1)/2;
}
На арене только тройки:
a[i][j] = (3 + rand()%3) & 3;
преобразуем диапазон 0..2 в 3..5 и оставляем только два младших бита
В начале были такие варианты:
a[i][j] = -3 ^ (rand() % 3 - 4);
и
a[i][j] = (1 - rand() % 3) & 3;
Но потом нашел более быстрый способ со сдвигом (всего 2 операции):
a[i][j] = 3 >> (rand() % 3);
Можно конечно и следующим способом попробовать, но случаев, когда выпадают нули, возможно, будет больше:
a[i][j] = 3 >> (rand() & 3);
Такого варианта, вроде, не было еще (хотя, это самое первое что пришло мне в голову при чтении вопроса):
int n = rand() % 3;
a[i][j] = n == 2 ? 3 : n;
Еще вариант с дополнительной переменной:
int n = rand() % 3;
a[i][j] = n + (n >> 1);
или
a[i][j] = 3 * (rand() % 3) / 2;
или
a[i][j] = rand() % 3 * 3 % 5;
или
a[i][j] = rand() % 3 * 5 / 3;
или
a[i][j] = (10 >> rand() % 3) / 3;