我正在制作一个随机数(一种猜谜游戏),并提出了ff。代码生成10个一位或两位数字(1或10到40):
public void generate()
{
for(int i=0; i<=1; i++)
{
for(int l=0; l<10; l++)
{
Random rdm=new Random();
arr[l] = rdm.nextInt(range)+1;
}
}
}
但是,此代码仅回答生成10个随机一位或两位数字的需要。我需要让这个程序生成唯一的随机数。我怎么能这样做?
对不起后期更新...我想对这个程序做的是,如果数组包含重复项,那么该副本将被替换为唯一的...
==============解决=====
新问题:
HashSet set=new HashSet();
Random random=new Random();
while(set.Size()<10)
{
set.add(random.nextInt(range)+1);
}
lbtest.setText(set.toString());
bgen.setEnabled(false);
gametext.setText("");
按照ggrigery的要求:
这里是关于ggrigery建议的更新代码。
答案 0 :(得分:5)
另一种选择是使用随机播放。
List<Integer> all = new ArrayList<>();
for(int i=1;i<=range;i++) all.add(i);
Collections.shuffle(all);
List<Integer> selected = all.subList(0, 10);
如果要选择每个元素,如果要丢弃重复项,则可能需要很长时间才能找到最后一个随机值。无论您选择一个元素还是所有元素,此方法都需要相同的时间。
答案 1 :(得分:1)
HashSet<Integer> set = new HashSet<Integer>();
Random random = new Random();
int i = 0;
while(set.size() < 10){
set.add(random.nextInt(40) + 1);
i++;
}
System.out.println(set);
System.out.println(i);
答案 2 :(得分:0)
在数组中进行搜索以了解值是否存在:
private boolean isInsideArray(int randomNumber, int[] arr){
for(int x = 0; x < arr.length; x++){
if(arr[x] == randomNumber) return true;
}
return false;
}
当你想知道数字是否在数组内时,只需调用此函数。
注意:此代码未经测试,只是一个帮助您的示例。也不是最优雅的解决方案,Java中有许多方法可以帮助您完成此操作而无需循环整个阵列。
答案 3 :(得分:0)
设置保证唯一元素。然后你可以得到结果并将它转换成你想要的任何集合或数组。
public List<Integer> generate() {
Random random = new Random();
Set<Integer> set = new LinkedHashSet<Integer>();
for(int i = 0; i < numberCount; i++) {
set.add(random.nextInt(range));
}
return new ArrayList<Integer>(set);
}
答案 4 :(得分:0)
public void generate() {
Random rdm = new Random();
int i = 0;
while (i < 10) {
int j = rdm.nextInt(range) + 1;
if (!arrayContains(j)) {
arr[i] = j;
i++;
}
}
}
public boolean arrayContains(int i) {
for (int k = 0; k < arr.length; k++) {
if (arr[k] == i)
return true;
}
return false;
}
这应该可以胜任。可能会更优雅。