Java 随机选择整数

Java 随机选择整数,java,android,Java,Android,我有下面的随机整数代码 for (int i=1;i<=5;i++) { int rand= new Random().nextInt(10); Log.d("Ramdom number", String.valueOf(rand)); } for(int i=1;i问题在于,您正在循环中创建一个随机对象。如果循环是“紧的”,如本例所示,随机对象将使用相同的值进行种子设定。将随机对象初始化移到循环外应该可以做到这一点 Random r = new Random(); for (i

我有下面的随机整数代码

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

for(int i=1;i问题在于,您正在循环中创建一个随机对象。如果循环是“紧的”,如本例所示,随机对象将使用相同的值进行种子设定。将随机对象初始化移到循环外应该可以做到这一点

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

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

    }
Random r=new Random();

对于(inti=1;i,所以你要找的不是随机数的列表,而是随机排序的30个数的列表

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

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

for(int i=1;i您可以将生成的数字保存在一个集合中,并且仅当随机数不在集合中时才使用它

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);
      } 
    }  
Random r=new Random();
Set generatedNumbers=new HashSet();

对于(int i=1;i对于可供选择的小范围数字,这应该起到以下作用:

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());
}
ArrayList number=new ArrayList();
对于(int i=0;i<20;++i){
增加(i);
}
收藏。洗牌(数字);
对于(int i=0;i<5;++i){
Log.d(“随机数”,numbers.get(i.toString());
}

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


如果没有,请发表评论。

您可以维护一个生成号码列表

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);

        }
}
boolean标志=false;
向量向量=新向量();

对于(int i=1;i您想要的是随机组合,请使用哈希表以避免重复

在我看来,代码应该是这样的:

    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();

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

检查这个问题:
nextInt()中的值在实际代码中有多大?nextInt()大约为30。不重复的随机数不是随机数。这是一个错误修复(观察良好)但这并不能保证不重复。如果你想知道是否生成了一个数字,你必须能够检查它,这需要数据结构。我将发布另一个解决方案,但它是粗略的。有效,但不会扩展(尽管OP说最大值只有30)顺便说一句,您的代码有一个bug。在副本上,没有打印值。因此它不会打印DUP(thumbsup),但在这种情况下也不会打印5个值。啊,我喜欢您删除DUP的方法。为什么要使用
子列表(0,maxnumbers)
在第二个代码段中?列表中只有
maxvalue
数字。@PhilippReichart
maxnumbers
maxvalue
是两个不同的值,列表中包含
maxvalue
不同的值,他只想要
maxnumbers
。是
Collections.shuffle()
包含在Java安装附带的库中?@TonyEnnis:这是Java SE的一部分:谢谢,很高兴知道。那么,我最喜欢你的解决方案。是的,非常感谢。它可以工作,我做了测试。我想知道这有多好?有没有可能被重复的数字???@Daler:这个算法保证没有number是重复的。它的工作原理类似于彩票:编号的球被洗牌,然后一个接一个地从箱子中取出。我不认为这是准确的-哈希表不随机排列值-有一个定义良好的算法。当你取出值时,会有偏差。我会用
h.put(I,I)
替换
h.put(I,I)
(aRandomValue(),i)
@TonyEnnis哈希表的定义就是键是唯一的,它们没有预定义的顺序:::这段代码只是从10个数字中选择5个不同的数字,如果你愿意的话,你可以用任何你喜欢的排序算法对它们进行排序。据我所知,哈希表是为有效地输入和获取值而设计的,而不是随机顺序ng.你认为依靠黑匣子代码的副作用是个好主意吗?@TonyEnnis在任何一本大学教科书中查找哈希表。效率来自于拥有可以在O(1)中访问的唯一键。文章作者没有要求具体的顺序,他只想要5个介于1和10之间的不同随机数
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));
}
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);
    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);