Java 如何使用mod运算符在输入范围之间生成随机数?
我试图找出如何在用户使用mod运算符预定义的范围之间生成一个数字 我不想要的Java 如何使用mod运算符在输入范围之间生成随机数?,java,Java,我试图找出如何在用户使用mod运算符预定义的范围之间生成一个数字 我不想要的 int min = input.nextInt(); int max = input.nextInt(); Random r = new Random(); int X = r.nextInt(max - min + 1) + min; 我想要的,类似于传统的int X=gen.nextInt()%100+1;而是使用Max和Min的值 这是我到目前为止所拥有的 import java.util.*; publi
int min = input.nextInt();
int max = input.nextInt();
Random r = new Random();
int X = r.nextInt(max - min + 1) + min;
我想要的,类似于传统的int X=gen.nextInt()%100+1;而是使用Max和Min的值
这是我到目前为止所拥有的
import java.util.*;
public class Modulus
{// begin class
public static void main(String[] args)
{// begin main
Scanner input;
int max, min, range;
Random gen;
gen = new Random();
input = new Scanner(System.in);
System.out.println("Please enter a max value: ");
max = input.nextInt();
// Ask user to input max value
System.out.println(" Please enter a minimum value: ");
min = input.nextInt();
// Ask user to input min value
range = gen.nextInt() % (Unknown)
// Get random integer between min and max values using %
System.out.println(" Your generated number is: " + range );
}
//end main
}
//end class
有人能解释一下我如何使用mod操作符来完成这个任务吗?您可以使用
Math.abs()
函数
即
并将高数值作为参数插入。需要注意的是,它仅适用于非负值。
range = Math.abs(gen.nextInt() % (max - min + 1)) + min
你会得到你想要的。如果nextInt
返回正数或0,则%
运算符返回一个从0
到max-min
的值,如果nextInt
返回负数,则返回一个从0
到-(max-min)
的值。因此abs
将返回0
至max-min
范围内的数字,添加min
将获得min
至max
范围内的数字
不过,我不建议这样做。当您从一组M个整数生成一个随机整数,然后使用%
将其减少为一组N个整数时,如果M不能被N整除,则结果分布将不均匀。某些结果将比其他结果更频繁地显示。我不知道你为什么不想使用gen.nextInt(max-min+1),但它是适合这项工作的工具
编辑:这样做的正确方法是:如果有一种方法可以生成0到M-1范围内的随机数,并且需要0到N-1范围内的随机数,那么只需要选取0到N*(M/N)-1范围内的数字[其中M/N是截断的整数除法],如果生成器选择的数字范围在N*(M/N)到M-1之间,请返回并重试。然后,当对结果使用%N
运算符时,将得到均匀分布。(如果生成器可以生成负值,则必须调整此算法。)Random.nextInt(int n)
的代码正是这样做的;以下是来自JRE来源的评论:
因此,既然nextInt(n)做了必要的工作,不使用它的唯一原因就是如果它是家庭作业,你不允许使用。可能重复@Jason不,那不是重复。链接的问题根本不使用
Random
,似乎是关于尝试编写一个非常简单的随机数生成器。@Aztechnology使用公式int X=Random.nextInt(100-0+1)+0获得0-100之间的范围;它与nextInt(101)相同,那么有什么意义呢?谢谢不幸的是我还需要处理负值:\。无论如何谢谢你!如果nextInt()
恰好返回Integer.MIN\u VALUE
@ajb,则此操作将失败,这是事实,但实现有条件地重新生成数字并不容易。我第一次实际使用了几乎相同的代码,但得到的数字超出了范围。我再试试看。至于为什么,这是因为这是一个考试中的额外问题,一直困扰着我。
range = Math.abs(gen.nextInt() % (max - min + 1)) + min
* The algorithm is slightly tricky. It rejects values that would result
* in an uneven distribution (due to the fact that 2^31 is not divisible
* by n). The probability of a value being rejected depends on n. The
* worst case is n=2^30+1, for which the probability of a reject is 1/2,
* and the expected number of iterations before the loop terminates is 2.