2013-08-13 2 views
0

Существует вопрос интервью следующим образом: «В некотором месте люди любят девочек больше, чем мальчиков. Когда-то у пары есть девушка, они не считают, что у нее второй ребенок. , если первый ребенок не девочка, у них будет второй ребенок ... пока у них не будет девушки. Предположим, что вероятность получить девочку составляет 50%, каково соотношение девочек и мальчиков ».имитирует распределение геометрии в Java

Из распределения геометрии отношение равно 1: 1.

Я хочу имитировать соотношение в Java. Вот мой код,

package art.programming.algorithm; 

import java.util.Random; 

public class Probability { 
private int numOfGirls = 0; 
private int numOfBoys = 0; 

private void random(){ 
    if (new Random().nextInt(1000000) >= 500000){ 
     numOfGirls = numOfGirls + 1; 
     return; 
    } 
    numOfBoys = numOfBoys + 1; 
    random(); 
} 

public static void main(String... args){ 
    Probability p = new Probability(); 
    for (int j=0; j<100; j++){ 
     System.out.println(j + " test"); 
     for (int i=0; i<10000000; i++){ 
      p.random(); 
     } 
     System.out.println("Boys " + p.numOfBoys); 
     System.out.println("Girls " + p.numOfGirls); 
     p.numOfBoys=0; 
     p.numOfGirls=0; 
    } 
} 
} 

Однако результат показывает, что количество мальчиков всегда больше, чем количество девочек. Из этих сообщений Why is random not so random? и http://engineering.mit.edu/live/news/1753-can-a-computer-generate-a-truly-random-number, я думаю, что истинная случайность не может быть создана без конкретной поддержки аппаратного обеспечения. В результате не удается смоделировать распределение геометрии? Мне интересно, есть ли способ улучшить случайность, так что отношение мальчиков к девушкам иногда составляет 10030100: 10000000, иногда 9999100: 10000000.

EDIT: после помещения нового Random() из случайного метода , Я получил ожидаемый результат.

+4

Вы имели в виду 'simulate'? –

+1

Случайные числа из java можно считать истинно случайными для 99% приложений. Вам не нужны истинные случайные числа для этого –

+0

. «Введите код здесь» предполагает, что это домашнее задание. Это? – Gunslinger

ответ

0
private void random(){ 
    if (new Random().nextInt(1000000) >= 500000){ 
     numOfGirls = numOfGirls + 1; 
     return; 
    } 
    numOfBoys = numOfBoys + 1; 
    random(); 
} 

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

private void random(){ 
Random randomGen=new Random(1000000); 
while(true){ 
    if (randomGen.nextInt() >= 500000){ 
     numOfGirls = numOfGirls + 1; 
     return; 
    } 
    numOfBoys = numOfBoys + 1; 
} 
} 

Что касается геометрического распределения, есть математические библиотеки, которые обеспечивают реализацию геометрического распределения, как math uncommons и JDistLib

+2

Однако полезный и хороший дизайн. Это не решает проблему. – Gunslinger

+0

Да, избегайте рекурсии, чтобы предотвратить переполнение потенциального стека. – Ming

0

Вот как вы могли бы опробовать количество мальчиков и девочек, которые есть у одной пары. Вы можете просто повторить этот процесс и подвести мальчиков и девочек к большому количеству пар, чтобы выполнить свой эксперимент.

boys = 0 
girls = 0 

while true 
    is_girl = random() < 0.5 
    if (is_girl) 
     girls = girls + 1 
     break 
    else 
     boys = boys + 1 
     continue 

Здесь random() получает случайное double равномерно распределены в диапазоне [0,1].

Смежные вопросы