2016-11-09 2 views
-1

Я работаю, чтобы получить переменную численности персонала, чтобы быть случайным, но не могу понять этоНевозможно получить случайное число

public class Coin 
{ 
    private final int HEADS = 0; 
    private final int TAILS = 1; 
    private int face; 
    private static int seed =0; 
    private Random r; 
    public Coin() 
    { 
     r = new Random(seed); 
     flip(); 
     seed++; 
    } 
    public void flip() 
    { 
     face = r.nextInt(2); 
    } 
    public int getFace() 
    { 
     return face; 
    } 
    public void setFace(int newFace) 
    { 
     face = newFace; 
    } 
    public boolean isHeads() 
    { 
     return (face == HEADS); 
    } 
    public String toString() 
    { 
     String faceName; 
     if (face == HEADS) 
      faceName = "Heads"; 
     else 
      faceName = "Tails"; 
     return faceName; 
    } 
    public static void main(String[] args) 
    { 
     Coin myCoin = new Coin(); 
     double randnumber =Math.random(); 
     int headCount=0; 
     for (int i =1; i<=100; i++) 
     { 
      myCoin.flip(); 
      if(myCoin.isHeads()) 
      { 
       headCount++; 
      } 
     } 
     System.out.println("If I flip my coin 100 times, I get " + headCount + " heads."); 
     headCount =0; 
     for (int i =1; i<=100; i++) 
     { 
      Coin yourCoin = new Coin(); 
      yourCoin.flip(); 
      if(yourCoin.isHeads()) 
      { 
       headCount++; 
      } 
     } 
     System.out.println("If I flip 100 coins, I get " + headCount + " tails."); 

    } 
} 

Всякий раз, когда я компилирую его и запустить программу, я получаю тот же результат, который

Если я переворачиваю свою монету 100 раз, я получаю 47 голов. Если я переворачиваю 100 монет, я получаю 50 хвостов.

Я не понимаю, как сделать 47 и 50 новыми случайными числами каждый раз, когда вы запускаете программу. Я посмотрел int Math.Random и другие случайные переменные, но не уверен, как реализовать его в этой программе.

+4

Ну, да, это цель использования семени: чтобы каждый раз получать одинаковый результат. – azurefrog

+0

Можете ли вы сказать Это немного яснее. Вот и все с использованием семян. –

+1

Если вы не хотите получать одинаковые результаты каждый раз, не заносите свой генератор случайных чисел с тем же начальным вводом каждый раз. Весь смысл установки семени заключается в том, чтобы ** гарантировать одинаковые результаты при каждом запуске программы **. – azurefrog

ответ

1

Что вы хотите: r = new Random (System.currentTimeMillis());

BTW: Генераторы случайных чисел всегда начинаются с того же числа, учитывая определенное количество семян.

Например, предполагается, что генератор «случайных чисел» добавил 2, чтобы найти следующее случайное число.

seed = 9 r (9) = 11; r (11) = 13; r (13) = 15.

Однако другое семя приведет к различной строке чисел.

seed = 4 r (4) = 6;

+2

«То, что вы хотите, это не обязательно. Легче просто использовать 'r = new Random();', так как он генерирует семя внутри, если вы этого не сделаете. –

1

Случайные числа в компьютерном программировании на самом деле не случайны. Они зависят от начального значения. Если вы даете ему одно и то же семя каждый раз, вы будете получать одну и ту же последовательность «случайных» значений каждый раз.

Если вместо этого вы используете пустой конструктор для Random, он создаст семя для вас, основанное на текущем времени системы. Таким образом, вы уменьшите вероятность того, что вы начнете с того же семени.

Итак, как уже упоминалось, либо вызывайте пустой конструктор Random, либо создайте псевдослучайное семя самостоятельно, прежде чем создавать Random, который принимает аргумент seed.

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

Если вы хотите, чтобы увидеть источник Java для Random класса, вы можете искать

grepcode java.util.Random.java 

и посмотреть, как JDK исполнители создают семя.

0

Решите проблему с семенем, объявив случайным образом в классе непосредственно в методе.

private Random r = new Random(); 

public Coin() 
{ 
    int x = r.nextInt(); 
    flip(); 
} 
Смежные вопросы