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
数字。@PhilippReichartmaxnumbers
和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);