创建唯一的随机数

时间:2010-12-10 15:13:10

标签: java random

我创建了以下方法,以便创建唯一的随机数。 (此唯一值属于树的节点):

  static Random rand = new Random();
public static ArrayList<Node> go(int n) {
    ArrayList<Node> list = new ArrayList<Node>();
    ArrayList<Integer> numList = new ArrayList<Integer>();
    // TODO Auto-generated method stub
    for(int i = 1; i<=5; i++)
    {
        int number = rand.nextInt(10)+1;
        if(list.size()>0 && !check(list,number))
        {
            i--;
            continue;
        }
        numList.add(number);
        Node node = new Node();
        node.data = number;
        list.add(node);
    }
     int w  = 0;
    for (Node d : list) {
        System.out.println(w+": "+d.data);
        w++;
    }
    return list;

}
  private static boolean check(ArrayList<Node> list, int num) {
    // TODO Auto-generated method stub
    boolean b = false;
    /*if(list.size()==0)
        return true;
    */
    for (Node node : list) {
        if(node.data == num)
            b = false;
        else
            b = true;
    }
    return b;
}

但它不会创建唯一的数字,我的列表中仍然存在重复数字。喜欢:

0: 10
1: 1 
2: 10 
3: 5 
4: 6 

8 个答案:

答案 0 :(得分:6)

问题是如果找到重复的数字,你不会在check函数内停止for循环。循环继续,b可以变回true。

你应该做的是例如:

  private static boolean check(ArrayList<Node> list, int num) {
    for (Node node : list) {
        if(node.data == num)
            return false;
    }
    return true;
}

答案 1 :(得分:3)

JónTraustiArason有你的答案,但是......

由于您拥有有限数量的允许值(整数),并且由于您不希望同一个值被多次拾取,因此可能更容易只需shuffle一组允许值。然后你可以从数组中选择下一个值,而不用担心每次检查是否重复。

在您的示例中选择介于1和10之间的五个值,您可以从数组{1,2,3,4,5,6,7,8,9,10}开始,然后通过随机播放将其重新排列为{3,4,7,1,10,9,5,8,2,6}之类的其他内容。从结果数组中取出前五个值,不用担心重复。

答案 2 :(得分:1)

在你的检查方法中,这看起来有点狡猾:

if (node.data == num) 
  b = false;
else
  b = true

当你找到一场比赛(例如b =假)时,你想回来吗?否则,下一次循环b可能会设置为true。为简化一点,如果要检查项目是否在集合中,可以执行list.contains(element)

答案 3 :(得分:1)

您“忘记”使用您准备好的numList

此代码应该可以正常工作:

static Random rand = new Random();

public static ArrayList<Node> go(int n) {
    ArrayList<Node> list = new ArrayList<Node>();
    ArrayList<Integer> numList = new ArrayList<Integer>();

    for (int i = 1; i <= 5; i++) {
        int number = rand.nextInt(10) + 1;
        if (numList.contains(number)) {
            i--;
            continue;
        }
        numList.add(number);
        Node node = new Node();
        node.data = number;
        list.add(node);
    }
    int w = 0;
    for (Node d : list) {
        System.out.println(w + ": " + d.data);
        w++;
    }
    return list;

}

答案 4 :(得分:1)

以@ eaj的观点来说明。

public static List<Node> go(int n) {
    List<Integer> numbers = new ArrayList<Integer>();
    for (int i = 1; i <= 10; i++) numbers.add(i);
    Collections.shuffle(numbers);
    List<Node> nodes = new ArrayList<Node>();
    for (Integer data : numbers.subList(0, 5))
        nodes.add(new Node(data)); // use a constructor for Node.
    for (int w = 0; w < nodes.size(); w++)
        System.out.println(w + ": " + nodes.get(w).data);
    return nodes;
}

答案 5 :(得分:0)

您的check功能错误。目前,它只返回 last 元素是否与num匹配。您希望在找到匹配项后声明true(例如,使用return true;)。

事实上,你可以在没有b的情况下做任何事情。我确信您可以使用list的{​​{1}}方法代替。

答案 6 :(得分:0)

您应该将check方法更改为:

  private static boolean check(ArrayList<Node> list, int num)
  {
    for (Node node : list)
        if (node.data == num)
            return false;

    return true;
  }

通过这种方式,您可以查看列表并在找到相同元素后立即返回false。如果您能够在不返回的情况下完成循环,则不会找到重复项,您可以返回true

答案 7 :(得分:0)

这是我的解决方案:

import java.util.ArrayList;
import java.util.Collections;


public class comboGenerator {

    public static void main(String[] args) {


    ArrayList<Integer> $combo = new ArrayList<Integer>();       // init. array list combo for randomization


        while ($combo.size() < 6) {  
            int rand = (int) (Math.random()*49+1);          // make new random number 1-49
            if (!$combo.contains(rand)){                    // check if we have that number in array list,{
            $combo.add(rand);                               // if there is no such number then add it to array list
            Collections.sort($combo);                       // sort the array list small >> large
            }
        }

    System.out.println("Random combination " + $combo);

}   
}

你不能得到相同的数字!