Как вы можете сделать генератор случайных чисел, который выбирает между числом 2 или 3. (не 1,2,3) - PullRequest
0 голосов
/ 28 января 2019

Привет, я работаю над генератором Монти Холла, и в части моего кода он мне нужен, чтобы сгенерировать случайное число 2 или 3. Это не может быть 1,2,3, но компьютер должен выбирать между 2 или 3. Спасибо!

Я пробовал randomCarDoor = ( rand() % 3 ) + 1;, но не работает.

randomCarDoor = ( rand() % 3 ) + 1;

Это дает мне номер 1,2,3, но я просто хочу 2 и 3

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Вы можете использовать младший бит случайного значения, но это очень рискованно, поскольку некоторые генераторы псевдослучайных чисел не обеспечивают адекватную дисперсию битов младшего разряда:

int two_or_three = 2 + rand() % 2;

Гораздо лучший способэто использовать величину случайного числа, которое указано как имеющее плоское распределение:

int two_or_three = 2 + (rand() >= RAND_MAX / 2);

Если вы хотите, чтобы числа 1 и 3, вот простое решение для любой пары:

int random_value = (rand() < RAND_MAX / 2) ? 1 : 3;
0 голосов
/ 28 января 2019

Это не тривиально при использовании rand(), поскольку линейный конгруэнтный генератор обычно чередуется между нечетными и четными числами.

Итак, одна из худших вещей, которую вы можете сделать, это использовать формулуна основе rand() % 2.

В этом конкретном случае я предлагаю вам нарисовать на основе

n = rand();

и назвать его 1, если n < RAND_MAX / 2 и 3 иначе, что вы можете сделать с

rand() < RAND_MAX / 2 ? 1 : 3

Это может иметь адекватные статистические свойства - возможно, некоторую нежелательную автокорреляцию - но, вероятно, не хуже, чем сам rand().

0 голосов
/ 28 января 2019

Как подсказывает @Kerrek SB, ваша формула: random ()% 2 + 2:

  • random ()% 2 ==> Получает [0 или 1]
  • [0 или 1] + 2 ==> Получает [2 или 3]

Функциональный код:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>



int main()
{
    // Declare variables
    int i;
    int randomNumber;

    // Set random seed
    srand(time(NULL));

    // Get 10 random numbers between 2 and 3
    for (i = 0; i < 10; ++i){
        randomNumber = rand() % 2 + 2;
        printf("Random %d: %d\n", i, randomNumber);
    }

    // End function
    return 0;
}
...