Подтвердить что ты не робот

Как получить шанс 50/50 случайного генератора

Я пытаюсь получить шанс 50/50 получить 1 или 2 случайного генератора.

Например:

Random random = new Random();
int num = random.nextInt(2)+1;

Этот код выведет либо 1, либо 2.

Скажем, я запустил его в цикле:

for ( int i = 0; i < 100; i++ ) {
    int num = random.nextInt(2)+1 ;
}

Как заставить генератор сделать равное число для 1 и 2 в этом случае?

Итак, я хочу, чтобы этот цикл генерировал 50 раз числа 1 и 50 раз из числа 2.

4b9b3361

Ответ 1

Один из способов: заполните ArrayList<Integer> пятьюдесятью 1 и пятьюдесятью двумя, а затем вызовите Collection.shuffle(...) на нем.

Ответ 2

Вы не можете достичь этого с помощью random. Если вам нужно точно 50 1s и 50 2s, вы должны попробовать что-то вроде этого:

int[] array = new int[100];
for (int i = 0; i < 50; ++i)
 array[i] = 1;
for (int i = 50; i < 100; ++i)
 array[i] = 2;

shuffle(array); // implement shuffling algorithm or use an already existing one

Ответ 3

50/50 довольно легко с Random.nextBoolean()

private final Random random = new Random();

private int next() {
  if (random.nextBoolean()) {
    return 1;
  } else {
    return 2;
  }
}

Тестирование:

final ListMultimap<Integer, Integer> histogram = LinkedListMultimap.create(2);
for (int i = 0; i < 10000; i++) {
    nal Integer result = Integer.valueOf(next());
  histogram.put(result, result);
}
for (final Integer key : histogram.keySet()) {
  System.out.println(key + ": " + histogram.get(key).size());
}

Результат:

1: 5056
2: 4944

Ответ 4

Вы можете настроить вероятность по пути, чтобы вероятность получения одного уменьшилась по мере того, как вы получили больше. Таким образом, у вас не всегда есть 50% шанс получить один, но вы можете получить ожидаемый результат (ровно 50):

int onesLeft = 50;

for(int i=0;i<100;i++) {
  int totalLeft = 100 - i;
  // we need a probability of onesLeft out of (totalLeft)
  int r = random.nextInt(totalLeft);
  int num;
  if(r < onesLeft) {
    num = 1;
    onesLeft --;
  } else {
    num = 2;
  }
}

Это имеет преимущество перед перетасовкой, потому что оно генерирует числа постепенно, поэтому для хранения чисел не требуется память.

Ответ 5

Вы уже создали случайный генератор, который с равной вероятностью возвращает 1 или 2.

Как многие (многие) другие упомянули, ваш следующий запрос, чтобы заставить точные 50/50 дистрибутивы в 100 испытаниях не совпадают с генерацией случайных чисел. Как показано в https://math.stackexchange.com/info/12348/probability-of-getting-50-heads-from-tossing-a-coin-100-times, реалистичное ожидание этого составляет всего около 8%. Поэтому, даже если вы можете ожидать 50 из них, этот точный результат на самом деле довольно редок.

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

Итак, для вашего фактического вопроса: как я могу заставить генератор сделать равное число для 1 и 2 в этом случае?

Лучший (юмористический) ответ, который я могу придумать, это: "Запустите его в бесконечном цикле".