Случайное семя дает другое число, как и ожидалось - PullRequest
0 голосов
/ 11 марта 2019

Для моего назначения мне нужно создать массив целых чисел, содержащих разные 4 цифры, используя Random (seed). Обратите внимание, что метод generateSecretDigits был запущен в классе, но должен был быть выполнен дома (я не могу вспомнить, какая часть была сделана в классе).

Мой профессор привел нам примеры, чтобы проверить, работает ли наш метод. Хотя моя программа генерирует код из 4 цифр, она не отображает тот же массив целых чисел, что и в приведенных примерах. Может ли кто-нибудь помочь мне найти ошибку?

Приведенные примеры:

  • generateSecretDigits (45) возвращает массив {9, 1, 0, 7}
  • generateSecretDigits (987) возвращает массив {5, 8, 9, 7}

Мой код:

// Declare the required import statements

import java.util.Random;

public class BullsAndCows {
  public static void main (String[] args) {

    int[] y = generateSecretDigits(45);

    for (int i = 0; i < y.length; i++) {
      System.out.print(y[i] + " ");
    }

    System.out.println();
  }


  // A method that randomly generates a secret 4-digits number 

  public static int[] generateSecretDigits(int x) {

    /* Declare and initialize an array
     * Assign a default value that is not between 0 and 9 inclusively to each element of the array */

    int[] secretDigits = new int[4];
    secretDigits[0] = 10;
    secretDigits[1] = 10;
    secretDigits[2] = 10;
    secretDigits[3] = 10;

    // Generate a number between 0 and 9 inclusively with the provided seed

    int seed = x;
    Random digit = new Random(seed);

    for (int i = 0; i < secretDigits.length; i++) {

      int secret = digit.nextInt(9);

      // Assign a value to each element of the array

      /* The contains() method takes as input an array of integers and a 
       * specific integer. The method returns true or false depending if an 
       * element is contained within a given array. Note that I have tested 
       * the contains() method and it works perfectly */

      if (contains(secretDigits, secret) == false) {

        secretDigits[i] =  secret;
      }

      else {

        i--;
      }
    }

    return secretDigits;
  }

1 Ответ

0 голосов
/ 11 марта 2019

Random - это генератор псевдослучайных чисел , который выводит числовую последовательность с использованием начального числа, сложения и умножения.Глядя на класс OpenJDK 11 Random, формула имеет вид:

nextseed = (oldseed * multiplier + addend) & mask;

, где multiplier, addend и mask являются константами:

private static final long multiplier = 0x5DEECE66DL;
private static final long addend = 0xBL;
private static final long mask = (1L << 48) - 1;

Если вы не измените формулуили константы:

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

...