我有以下代码来获取随机数字
for (int i=1;i<=5;i++) {
int rand= new Random().nextInt(10);
Log.d("Ramdom number", String.valueOf(rand));
}
问题在于我不想重复随机数字,这意味着当我运行此代码时,它给了我5个数字但其中两个至少重复。有什么建议吗?
答案 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);
}
}