2012-10-15 156 views
0

我用下面的代码来生成随机数:随机数生成查询

long randNo = Math.round(Math.random() * 10000); 

我有,我发现重复的一些情况。它可能会生成相同的数字吗?

+0

ref http://stackoverflow.com/questions/4655931/12-digit-unique-random-number-generation-in-java – Salil

+5

你似乎不明白“随机”的含义。 –

+3

当然,它可能会产生相同的数字。随机性和唯一性是两个完全不同的东西。 – Jesper

回答

2

是的,这是可能的。如果你需要生成从0 10000件不同的随机数到9999,您可以生成连续的10000号列表,然后调用Collections.shuffle就可以了。

1

如果您需要高质量的随机数“开箱即用”,例如用于产生随机加密密钥或情况下,要克服一些java.util.Random中的弱点,那么你就可以大致使用java.security.SecureRandom作为一个下拉更换为java.util.Random

Random diceRoller = new SecureRandom(); 
// proceed as before... 

SecureRandom实现提供随机性更高的质量,并与帮助,从操作系统,采用熵的来源种子本身(或“真正的不可预测性”)在本地机器上可用。但是,它比其他典型发电机慢大约20-30倍。 (请注意,“慢”仍然意味着你可以产生大约在第二个一百万随机多头在2GHz的处理器!)

参考:http://www.javamex.com/tutorials/random_numbers/generators_overview.shtml

+0

感谢。有没有什么办法可以在上面的代码中生成唯一的数字?在此先感谢 –

+0

随机性从不保证唯一性。如果你想生成唯一的号码试图保持独特的号码池,并从池中挑选号码 – Anshu

1

利用随机数,在范围内的所有数字都同样可能。这意味着如果你得到一个数字,下一个值就像它第一次出现一样。

顺便说一句:在你的例子中使用round不是一个好主意,因为数字1到9999的可能性是相同的,但数字0和10000的可能性只有一半,只有半数舍入或半数舍入。

一种更有效的方式是使用

Random rand = new Random(); 

// as needed 
int num = rand.nextInt(10000); // will be [0, 10000) 

如果你需要生成唯一的号码,你可以使用Collections.shuffle

List<Integer> nums = new ArrayList<Integer>(); 
for(int i = 0; i < 10000; i++) nums.add(i); 
Collections.shuffle(nums); 

这会给你最多10000识别号随机订购。

+0

感谢。有没有什么办法可以在上面的代码中生成唯一的数字?在此先感谢 –

+0

我加入了一个例子唯一的编号。 –

+1

谢谢Peter ... –