Java生成随机数但不包括零

9
int num = 10;
Random rand = new Random();
int ran = rand.nextInt(num);
if (ran==0){          
  ran= ran+1;
}
System.out.println("random : "+ran);  

这是我目前编写的代码,有没有更好的方法来实现这个功能?当随机数为0时,我觉得这是一种硬编码的方式,因此我增加了1。


2
你的逻辑看起来有问题。如果数字是 0,那么你会将随机数增加 1,但不会打印出该值。此外,在你的示例中,数字 1 出现的可能性是其他任何数字的两倍。 - Kevin Brydon
我做了一次编辑来修复打印逻辑问题,因为它实际上与问题不相关。 - Jaime Hablutzel
8个回答

31
那段代码的问题在于数字1出现的概率是其他数字的两倍(因为当nextInt()返回0或1时,你得到的有效结果是1)。
最好的解决方法是始终添加1并从较小的范围请求随机数。
int rnd = rand.nextInt(num - 1) + 1;

maxValue-1是什么意思?这里指定的数字吗? - newbieprogrammer
2
maxValue是您将获得的最大随机数。因为您稍后会添加一个,所以您必须请求maxValue-1。 - vszurma
如果 maxValue 真的是您将获得的最高数字,则 -1 是错误的,因为 nextInt(10) 返回范围在 0..9 的数字。因此我修改了答案。 - Vlasec
1
@Vlasec:你说得对。nextInt的参数是一个排除边界,所以如果你想要1到10的数字,那么需要使用nextInt(10) + 1 - Joachim Sauer
1
我们能否编辑答案以表示nextInt是排除的,maxValue永远不会被返回,因此"-1"可能是不必要的? - dieresys
@dieresys 是正确的。-1 不需要。例如,要从所有正整数(0 不包括在内)中获取随机数,公式将是: int rnd = rand.nextInt(Integer.MAX_VALUE) + 1 - poshak

4

我猜您正在尝试获得1到'num'之间的随机数。

一种更通用的方法可以是:

int Low = 1;
int High = 10;
int R = r.nextInt(High-Low) + Low;

这将会给你一个1(包含)到10(不包含)之间的随机数。(或者使用High=11来得到10包含在内的随机数)


这有点混乱了。我只想要一个在10以内但不为0的随机数。 - newbieprogrammer
1
请告诉我哪个部分让你感到困惑,我会尽力更好地解释。 - Lav
假设我想要从1到小于10的随机数,我应该指定哪个数字? - newbieprogrammer
使用上述代码中的Low=1和High=10,你将得到你想要的。 - Lav
1
这样会得到1-9之间的整数吗? - newbieprogrammer
显示剩余2条评论

2
Random random = new Random();
int ran = random.nextInt(9) + 1; //10 is maxRandom value for this code. 1-10

什么意思,random.nextInt(num-1) + 1? - newbieprogrammer
1
@newbieprogrammer random.nextInt(maxValue)+1中的maxValue设置了一个从0maxValue的范围。因此,如果maxValue等于9,则您的最大整数将为10。 - Petr Shypila
1
random.nextInt(9) + 1 将会给你一个1-9之间的随机数。 - CptSupermrkt

1
你还可以做以下操作:
int randomNumber = 0;
do {
  randomNumber = rand.nextInt(maxValue);
} while(randomNumber == 0);

1

试试这个:

int num,max=10,min=1;
Random r=new Random();
num=r.nextInt(max-min)+1;

你需要在文件开头导入以下内容:
import java.util.Random;

1

只需将下限(num变量)减1,并将ran变量加1即可。

    int num = 10;
    Random rand = new Random();
    int ran = rand.nextInt(num - 1) + 1;
    // or decrease num first n-- and then int ran = rand.nextInt(num) + 1

现在的限制(上限)是8(包括),例如,最终数字总是不包括的。如果它变成0,它会增加到1,如果它变成8,它会增加到9,这原本应该是上限。


0

不要期望从Random中获得这种功能,你应该自己实现。可以通过结果做很多事情 - 乘法、加法(例如,对于随机奇数,使用2*nextInt(n)+1),使用对数刻度来计算音符频率,使用映射或枚举来获取随机对象...

nextInt(n)方法只是为了给你n个不同的值(从0n-1)。不要对它有更多的期望,自己实现剩下的部分。如果我理解你的问题正确,你需要数字1..9,所以你应该请求nextInt(9)+1来获取0..8,然后再加上1

希望这个解释能够帮助你,我看到了很多答案,但我没有喜欢任何一个解释。


-1

尝试:

int num = 10;
Random rand = new Random();
int ran = rand.nextInt(num) + 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接