非重复随机数

时间:2011-02-04 11:19:39

标签: java random

作为我项目的一部分,我需要通过给出一组数字来创建非重复的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);

     }

2 个答案:

答案 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次(或任意次数)并且不支持数组的任何特定元素。