int size = 5;
int[] list = new int[size];
Random rand = new Random();
for(int i = 0; i < size; i++)
{
list[i] = rand.nextInt(100);
}
for(int element : list)
System.out.print(element + " ");
我试图修改此随机数生成器,以便它不会复制随机生成的数字。我怎么能做到这一点?谢谢你的帮助。
答案 0 :(得分:2)
可以想象的最愚蠢的方式实际上是一种可接受的策略:只丢弃已经存在于数组中的任何生成的数字。但是,如果您希望改进这一点,您将面临空间或时间成本(或两者)。对于您在问题中显示的数组大小,没有必要这样做。
答案 1 :(得分:1)
您可以将生成值存储在Set
(这是一个包含唯一元素的数据结构中)。
每次生成新号码时,都可以检查Set
中是否已存在。例如:
Set<Integer> set = new HashSet<Integer>();
Random rand = new Random();
for(int i = 0; i < size; )
{
int next = rand.nextInt(100);;
if (!set.contains(next)) {
set.add(next);
i++;
}
}
请注意,当尚未生成尚未生成的数字时,我只会增加索引 。
答案 2 :(得分:1)
有各种方法可以做到这一点。您已有的简单变体:
int size = 5;
int[] values = new int[100];
int[] list = new int[size];
for( int i = 0; i < 100; i++ ) values[i] = i;
Random rand = new Random();
int ctListSize = 0;
int xList = 0;
while( true ){
int iCandidateValue = rand.nextInt(100);
if( values[ iCandidateValue ] == 0 ) continue; // already used
list[ xList++ ] = iCandidateValue;
values[ iCandidateValue ] = 0;
if( xList == size || xList == 100 ) break;
}
for(int element : list) System.out.print(element + " ");
答案 3 :(得分:0)
列出包含您在RNG上看到的所有号码的列表。然后检查列表是否存在 - 如果存在,请不要将其添加到列表中。如果它没有添加到列表中。
for (int i = 0; i < array.length; i++){
int num = rand.nextInt(100);
if (list.contains(num){
break;
}else{
list.add(num);
}
这样您就可以返回列表,看不到重复项。
或者考虑使用只允许使用唯一键的Set数据结构。