我有一个生成随机整数的方法。我不希望重复整数,所以我创建了这段代码 -
int prevInt = 0;
private int randomInt() {
int random = (int) (Math.random() * 3);
//generate random numbers between 0 to 3 inclusive
if(random == prevInt)
return randomInt();
//if previous random number is equal to currently generated
//random number, then call this method again for a different
//random number
prevInt = random;
return random;
//else return the generated random number
}
以上代码是否可以安全使用?在最坏的情况下,Math.random() * 3
生成的所有随机整数是否可能相同?
答案 0 :(得分:1)
private final Random random = new Random();
private int randomInt(final int prev, final int max) {
final int next = random.nextInt(max - 1);
if(next >= prev){
return next + 1;
}else{
return next;
}
}
这将返回0到max之间的int而无需重复。
答案 1 :(得分:1)
public static double random()
返回带正号的 double 值,大于或等于0.0且小于1.0。返回值是伪随机选择的,具有来自该范围的(近似)均匀分布。
有生成随机(真正伪随机)数字的两种主要方法:
Random类生成随机整数,双精度数,long数等, 在各种范围内。
- 醇>
静态方法Math.random在0(包括)之间生成双精度数 和1(独家)。
生成随机整数:
不要使用Math.random
(它会产生双打,而不是整数)
使用Random
类生成0到N之间的随机整数。
要生成一系列随机数作为一个单元,您需要使用单个Random对象 - 不要为每个新的随机数创建一个新的Random对象。
其他替代方案是:
SecureRandom, a cryptographically strong subclass of Random
ThreadLocalRandom, intended for multi-threaded cases
请查看this帖子。 SO Reference 1,Reference 2
答案 2 :(得分:0)
从javadoc,Math.random()返回范围内的伪随机和(近似)均匀分布数。
因此,当您没有严格的准确性时,您可以使用它。否则,寻找更好的解决方案。
答案 3 :(得分:0)
尝试这个简单的代码并亲自看看
for (int ran = 0; ran < 10; ran++) {
int random = (int) (Math.random() * 3);
System.out.println(random);
}
我的案例输出
2 2 0 2 1 0 0 0 2 1
答案 4 :(得分:0)
是的,它是安全的,但我们永远不知道会发生什么,所以我们可以简单地将Math.random乘以两次以保持良好的安全性 的 的
的 int random = (int) (Math.random() * Math.random() * 3);
的
答案 5 :(得分:0)
首先,我必须指出你的问题标题不是那么清楚。安全可以意味着各种各样。在这种情况下,我认为你的意思是代码算法的安全性,而不是安全性,也不仅仅是Math.random()。
不幸的是,您的代码在算法上并不安全。即使Math.random是安全的,你的代码也总是有可能在任何时候运行:粗略地说它意味着你无法保证你的代码在有限的时间内结束。
假设您在4个数字中随机抽取数字。如果您在编号之前绘制随机数排除,那么您实际上并非从4个数字中抽取:它是3.我建议采用另一种方法:
int prevInt = -1;
private int randomInt() {
if (prevInt == -1) {
int random = (int) (Math.random() * 4);
//generate random numbers between 0 to 3 inclusive
} else if
int random = (int) (Math.random() * 3);
random = (random >= prevint) ? (random + 1) % 4 : random;
}
prevInt = random;
return random;
}
private void resetRandom() {
prevInt = -1;
//use when you want to reset information that you have 'before' result.
}
此算法在有限时间内结束。关注Math.Random()本身是否危险或其他任何好人都会解释。