随机选择int数

时间:2012-05-28 13:32:23

标签: java android

我有以下代码来获取随机数字

for (int i=1;i<=5;i++) {
  int rand= new Random().nextInt(10);
  Log.d("Ramdom number", String.valueOf(rand));
}

问题在于我不想重复随机数字,这意味着当我运行此代码时,它给了我5个数字但其中两个至少重复。有什么建议吗?

8 个答案:

答案 0 :(得分:7)

对于一小部分数字可供选择,这应该可以解决问题:

ArrayList<Integer> numbers = new ArrayList<Integer>();
for (int i = 0; i < 20; ++i) {
    numbers.add(i);
}
Collections.shuffle(numbers);
for (int i = 0; i < 5; ++i) {
    Log.d("Random number", numbers.get(i).toString());
}

答案 1 :(得分:1)

问题是你在循环中创建一个Random对象。如果循环是“紧”,就像在这种情况下一样,Random对象将以相同的值播种。在循环外部移动Random对象初始化应该可以解决问题。

Random r = new Random();
for (int i=1;i<=5;i++) {
            int rand= r.nextInt(10)

            Log.d("Ramdom number", String.valueOf(rand));  

    }

编辑:

这应该有效(至少它对我有用)

public static Integer[] getRangedInt(int maxRange, int numCount)
{
    if (maxRange < numCount)
    {
        throw new Exception("maxRange cannot be smaller than numCount");
    }

    Set<Integer set = new HashSet<Integer>();
    Random r = new Random();
    while (Set.size() < numCount)
    {
        int random = r.nextInt(maxRange);  
        while (!set.add(random))
        {
            random = r.nextInt(maxRange); 
        }
    }

    return set.toArray(new Integer[set.size()]);
}

答案 2 :(得分:1)

final int maxnumbers = 5;
final int maxvalue = 10;
final Random generator = new Random();
Set<Integer> numbers = new HashSet<Integer>();
while(numbers.size() < maxnumbers){
    numbers.add(random.nextInt(maxvalue));
}

在此循环之后,您应该在集合maxnumber中的0和maxvalue之间拥有numbers个非重复随机数。您必须注意,因此在使用此方法时不会获得太多迭代,即从10000中生成9999个非重复数字可能需要很长时间。

另一个更具可扩展性的版本是拥有一个数字列表:

List<Integer> numbers = new ArrayList<Integer>();
for(int i = 0; i<maxvalue; i++){ numbers.add(i); }
Collections.shuffle(numbers);
List<Integer> randomnums = numbers.subList(0, maxnumbers);

答案 3 :(得分:0)

所以你要找的不是随机数列表,而是随机排序的30个数字列表。

一种方法是生成所有可能值的列表,然后随机排序,然后根据需要从列表的前面剥离它们。这是一些伪代码:

for(int i=1; i<=30; i++) {
    double r = rand();
    while (null != aTreeSet.get(r)) r = rand();
    aTreeSet.put(r, i);
}

其中rand()会返回一些随机值(不是您寻找的1-30,即i),也许在0到1之间,而aTreeSet就是您的想法。

循环可以防止rand()返回重复的不太可能的情况下的悲伤。

要使用此功能,请按排序顺序从aTreeSet中提取值。

编辑 - 解决方案

另一种方法是生成1-30值,如果它还没有出现在“我看过这个”Set中,则添加它并返回值。如果 ,则生成一个新的随机数。重复,直到发现未使用的号码。相对而言,对于最后几个值,这表现不佳。对于现代处理器上的30个值,它当然会在几毫秒内完成。如果你的最大值是1000而不是30,我会开始担心。

答案 4 :(得分:0)

我认为你需要一组随机数。这个提示应该足够了。

如果没有,请发表评论。

答案 5 :(得分:0)

您可以维护一个生成的数字列表

boolean flag=false;
Vector<int> vec = new Vector<int>();
for (int i=1;i<=5;i++) {
        flag=false;
        int rand= r.nextInt(10);
        for(int j=0;j<vec.size();j++)
        {
             if(vec.get(j)==rand)
             { 
                flag=true;
                break;
             } 
        }
        if(flag)
        {
            continue;
        } 
        else
        {
             Log.d("Ramdom number", String.valueOf(rand));
             vec.add(rand);

        }
}

您可以维护生成数字的向量并检查

该号码是否已生成,然后生成新号码

其他显示此号码

答案 6 :(得分:0)

你想要的是随机组合,使用哈希表来避免重复

从我的头脑中,代码应该是这样的:

    Ramdom r = new Random();
    Hashtable<Integer, Integer> h = new Hashtable<Integer, Integer>();
    while( h.keys().size() < 5 ) {
            int i = r.nextInt(10);
            h.put(i,i);
    }
    Integer[] k = (Integer[]) h.keySet().toArray();

该行

    h.put(i,i);

如果重复该值,则覆盖该值,因此只有不同的绘制数字才会在哈希表中包含条目。

答案 7 :(得分:-1)

您可以将生成的数字保存在一个集合中,只有当它不在集合中时才使用随机数

Random r = new Random();
    Set<Integer> generatedNumbers = new HashSet<Integer>();
    for(int i = 1;i<=5;i++)  {
      int rand = r.nextInt(10)
      if (!generatedNumbers.contains(rand)) {
        Log.d("Ramdom number", String.valueOf(rand));
        generatedNumbers.add(rand);
      } 
    }  
相关问题