作为我项目的一部分,我需要通过给出一组数字来创建非重复的2或3位随机数。我不想为此实现列表或数组,因为我应该为每个函数调用获得1个随机数。
我尝试使用SecureRandom类的Java来做到这一点。我也得到了一些网站的帮助,但是我被困在中间,我们可以洗掉VALUES并完成它吗?但我不知道如何做到这一点。谁能帮我?
import java.security.SecureRandom;
public class RandomNumber {
private static final RandomNumber rnd= new RandomNumber();
private static final char[] VALUES = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
private static final SecureRandom srn= new SecureRandom();
public String createID()
{
byte[] bytes = new byte[3];
srn.nextBytes(bytes);
}
答案 0 :(得分:12)
Fisher-yates shuffle algorithm是要走的路。它有效地改组。 它在线性时间内工作。
这是algo
To shuffle an array a of n elements:
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]
和代码
for(int i=VALUES.length-1; i>0; i--){
int rand = (int) (Math.random()*i);
char temp = VALUES[i];
VALUES[i] = VALUES[rand];
VALUES[rand] = temp;
}
答案 1 :(得分:-2)
当Manoj的代码迭代时,它更可能交换VALUES []的较低元素而不是较高元素。例如:对于i = 9,它有1/10的机会与数组的任何成员交换(包括它自己)。然后,对于i = 8,我们再也不能与VALUES [9]交换,因为Math.random()* i只能跨越0到8.这意味着VALUES [9]将比任何时候更多地等于原始VALUES [9]其他元素将等于其各自的元素(依此类推,随着我变小,交换的可能性增加)。
我只想纠正上面的答案而不是数组的重量元素:
for(int i=0; i <= VALUES.length - 1; i++){
int rand = (int) (Math.random()*(VALUES.length-1));
char temp = VALUES[i];
VALUES[i] = VALUES[rand];
VALUES[rand] = temp;
现在,shuffle执行VALUES.length次(或任意次数)并且不支持数组的任何特定元素。