Рандом в двумерном квадратном массиве

Как заполнить массив рандомно только 0, 1 и 3, не взяв при этом 2.


Ответы (7 шт):

Автор решения: Zhihar

как вариант:

  1. создаете массив

     const int arr[] = {0, 1, 3} 
    
  2. получаете случайное число от 0 до 2 включительно:

     const int pos = rand() % 3;
    
  3. получаете нужное значение:

     const int value = arr[pos];
    

так вы получите равномерное распределение между данными числами, причем можно использовать любые последовательности чисел и т.д. - т.е. более универсальное даже решение, чем вы требуете

→ Ссылка
Автор решения: Harry

Ну типа

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;
    }
→ Ссылка
Автор решения: AR Hovsepyan

Присваивать исключив двойку:

arr[i][j] = (rand() % 3 + 1) ^ 2;
→ Ссылка
Автор решения: MBo

На арене только тройки:

a[i][j] = (3 + rand()%3) & 3;

преобразуем диапазон 0..2 в 3..5 и оставляем только два младших бита

→ Ссылка
Автор решения: TigerTV.ru

В начале были такие варианты:

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);
→ Ссылка
Автор решения: Андрей NOP

Такого варианта, вроде, не было еще (хотя, это самое первое что пришло мне в голову при чтении вопроса):

int n = rand() % 3;
a[i][j] = n == 2 ? 3 : n;
→ Ссылка
Автор решения: TigerTV.ru

Еще вариант с дополнительной переменной:

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;
→ Ссылка