Math.Random всегда устанавливает случайное число равным 0

Создание программы, в которой случайное число генерируется с использованием math.random, которое я поместил в функцию и вызвал эту функцию в программе, чтобы сделать вещи более аккуратными, но выводимое случайное число всегда равно тому, на что установлено целое число secret_number, и я я не уверен, как исправить это, чтобы создать случайное число. Я хотел бы сохранить math.random в функции и использовать параметры

package guessinggame3;
import java.util.Scanner; //imports scanner to read from keyboard
import java.util.ArrayList;


public class GuessingGame3 { //start of public class

static Scanner kboard = new Scanner(System.in); //calls scanner 


public static void main(String args[]) //start of main 
{

System.out.println("Welcome to the guessing game, the computer will 
generate a random number that you have to guess, good luck!"); //opening 
message explaining how to play 

int secret_number = 0;
int number_of_guesses = 0;
int user_guess ;
ArrayList<Integer> entered_numbers = new ArrayList<Integer>();


generate_random_number(secret_number); //calls he function 
generate_random_number to say the random number has been generated 




for(int i=0; i<20;i++) { // start of for loop sets user attempts to 20


System.out.println("Please make your guess"); //asks user to enter make 
their guess             
user_guess = kboard.nextInt();
number_of_guesses++; // adds on to the counter after each user guess


if (entered_numbers.contains(user_guess)) //checks if entered number = 
number stored in array
{
System.out.println("You have already entered this number"); //displays 
error message if user enters same number again
continue;
}

else 
{
entered_numbers.add(user_guess);
if (user_guess == secret_number)
System.out.println("Your guess is corret you win!");
}

if (user_guess < secret_number)
{
System.out.println("Guess is too low");
}

if (user_guess > secret_number) 
{
System.out.println("Your guess is too high");
}


System.out.println (20 - number_of_guesses + " Guesses remaining"); 
//Tells the user how many guesses they have remaining 


} //end of for loop

} //end of main

static void generate_random_number(int secret_number)  //start of function 
generate_random_number function passing secret_number as a parameter
{       
secret_number = (int)(Math.random()*100) + 1; //generates random number 
between 0 and 100
System.out.println("The computer has generated it's number"); //lets the 
user know that the random number has been generated
} //end of function generate_random_number

} //конец общедоступного класса

Переназначение значения параметра не меняет его значение на месте вызова, Java так не работает

JonK 31.05.2019 13:03

Пожалуйста, удалите все эти бесполезные комментарии. Это беспорядок, который затрудняет чтение кода без добавления полезной информации.

duffymo 31.05.2019 15:23

Начинающий программист вряд ли поймет, почему здесь важна передача по значению. Лучшее предложение — изменить сигнатуру метода на public int generateSecretNumber() { return (int) (Math.random()*100.0); }

duffymo 31.05.2019 15:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
125
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы передаете secret_number функции generate_random_number, secret_number копируется. Таким образом, когда вы присваиваете secret_number значение (int)(Math.random()*100) + 1 внутри своей функции, вы просто меняете ее копию.

Ответ принят как подходящий

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

static int generate_random_number(int secret_number) 

И в основной функции установите свой secret_number на значение, которое возвращает метод

secret_number = generate_random_number(secret_number);

Вы также должны добавить возвращаемое значение для вашего метода, чтобы оно было таким:

static int generate_random_number(int secret_number){       
    secret_number = (int)(Math.random()*100) + 1;
    System.out.println("The computer has generated it's number");
    return secret_number;
}

Спасибо за комментарий, но теперь я получаю сообщение об ошибке, говорящее, что secret_number не был инициализирован, и метод должен возвращать тип int?

rxeqz 31.05.2019 13:27

Я думаю, вы изменили неправильные строки. Оставьте int secret_number = 0; прежним, замените generate_random_number(secret_number); на secret_number = generate_random_number(secret_number);

Mertcan Seğmen 31.05.2019 13:40

А также добавьте return secret_number; в конце вашего метода generate_random_number, извините, я забыл добавить это

Mertcan Seğmen 31.05.2019 13:43

Спасибо за помощь, это решило мою проблему :)

rxeqz 31.05.2019 13:50

Другие вопросы по теме