我将建议另一种方法。
生成下一个数字时,应该只使用rand.nextInt(v),因为它保证生成的数字小于v。生成大于v 的数字永远不会成为一个因素。
public int findMul(int v) {
Random rand = new Random();
int numoftries = 0;
int random = rand.nextInt(v);
while (true) {
if(random==0) {
numoftries++;
random=rand.nextInt(v);
continue;
}
if(v%random==0) {
numoftries++;
break;
}else {
numoftries++;
random=rand.nextInt(v);
}
}
return numoftries;
}
你的循环最初返回0,因为条件是v%random==0,所以如果第一个生成的数字不是一个因素,它会立即返回numoftries
您还需要每次在循环中生成一个新数字,因为如果生成的数字不是一个因素,那将是一个无限循环。
你可以像这样测试代码:
import java.util.Random;
public class RandomFactor {
public int findMul(int v) {
Random rand = new Random();
int numoftries = 0;
int random = rand.nextInt(v);
while (true) {
if(random==0) {
numoftries++;
random=rand.nextInt(v);
continue;
}
if(v%random==0) {
numoftries++;
break;
}else {
numoftries++;
random=rand.nextInt(v);
}
}
return numoftries;
}
public static void main(String[] args) {
RandomFactor x = new RandomFactor();
System.out.println(x.findMul(1000));//1000 is the test case
}
}
有时,如果数字太小,它产生0的可能性更高,这会抛出一个ArithmeticException。所以我们添加了一个 if 语句来防止这种情况发生。
如果你想用nextInt()达到同样的效果:
import java.util.Random;
import java.util.Scanner;
public class RandomFactor {
public int findMul(int v) {
Random rand = new Random();
int numoftries = 0;
int random = rand.nextInt(v);
while (true) {
if(random==0) {
numoftries++;
continue;
}
if(v%random==0) {
numoftries++;
break;
}else {
numoftries++;
random=rand.nextInt(v);
}
}
return numoftries;
}
public static void main(String[] args) {
RandomFactor x = new RandomFactor();
Scanner input = new Scanner(System.in);
while(true) {
try {
System.out.print("\nEnter your guess: ");
int guess = input.nextInt();
System.out.println(x.findMul(guess));
}catch(NumberFormatException e) {
break;
}
}
}
}
如果必须使用 Math.random
import java.util.Scanner;
public class RandomFactor {
public static int digits(int number) {
String current = String.valueOf(number);
return current.length();
}
public static int newrandom(int v) {
return (int)(Math.random()*(digits(v)*10));
}
public int findMul(int v) {
int random = newrandom(v);
int numoftries = 0;
while (true) {
if(random==0) {
numoftries++;
random = newrandom(v);
continue;
}
if(v%random==0) {
numoftries++;
break;
}else {
numoftries++;
random=newrandom(v);
}
}
return numoftries;
}
public static void main(String[] args) {
RandomFactor x = new RandomFactor();
Scanner input = new Scanner(System.in);
while(true) {
try {
System.out.print("\nEnter your guess: ");
int guess = input.nextInt();
System.out.println(x.findMul(guess));
}catch(NumberFormatException e) {
break;
}
}
}
}
说明
因为 Math.random 返回一个双精度数,我们需要生成一个与猜测的位数相同的数字,然后转换为一个整数,以便正确比较。我们通过将其转换为字符串(方法数字)然后将结果乘以 10 来做到这一点,因为 Math.random 返回一个介于 0 和 1 之间的数字。但是,请记住,这不是有效的,因为数字的位数越多,它会做出更多的猜测。例如,如果我们猜测 5,它将从 0-9 猜测。如果我们猜测 10,它会从 10 到 100 猜测。
编辑:修复了一个导致它永远循环的致命错误,因为如果随机数是0,它不会重新生成数字。