如何在1到9之间生成9个随机数,不重复,一个接一个。就像是: 假设生成的第一个随机数是4,那么下一个随机数必须在[1,9] - {4}中。 我的第一种方法是将每个随机生成的数字添加到一个集合中,从而避免重复。但是在更糟糕的情况下,就像我们已经生成6并且我们必须再生成3个数字一样,这个过程有点慢。当范围从[1,9]变为[1,1000]时,这种方法听起来并不正确。 任何人都可以提出另一种方法。
答案 0 :(得分:5)
从排序数组开始(通过for循环很容易创建);然后shuffle bey用另一个(随机选择的)元素交换每个数组元素。 为避免评论中讨论的偏见,其他元素的索引必须等于或高于第一个元素的索引。 如果索引相等,则不交换元素。 (这个答案的原始版本包含一个关于元素被换回的可能性的句子,但现在已经过时了,因为突然修改后不再发生这种情况)
答案 1 :(得分:4)
如果您对实现自己想做的算法不感兴趣,可以使用已经在Java库中实现的简单方法。
您可以创建List
(Integer
至start
的集合(已排序end
),其中start=1
和end=9
位于您的Collections.shuffle(list);
示例),然后使用方法static List<Integer> randArray(int start, int end) { //specify start/end
List<Integer> randList=new ArrayList<>(end-start+1); //create list
for (int k=start;k<=end;k++) { //generate integers in order
randList.add(k); //add integers to the list
}
Collections.shuffle(randList); //reoder randomly the list
return randList; //return the list with items in random order
}
,例如以这种方式:
shuffle
{{1}}方法只是随机重新排序列表中的项目。
答案 2 :(得分:2)
以下是两种可能的方法: -
方法1: -
- 将所有数字放在大小为n的数组中。
- 随机选择一个数字索引i = rand(0,size)
- print arr [i]
- swap arr [i]和arr [size-1]
- size = size -1
- 重复1到5,直到列表用尽。
醇>
时间复杂度: O(N)
空间复杂性: O(N)
方法2: -
- 选择K的池大小。
- 生成K个随机整数。
- 将它们显示为第一个k结果。
- 将它们添加到哈希集。
- 为池中的所有先前整数添加所有ak + 1。
- 如果它不在hashset中,请加1。
- 从池中随机选择一个整数r并显示它。
- 如果r + 1不在hashset中,则将其添加到池中
- 做到7到8,直到游泳池用尽。
醇>
时间复杂度: O(N)
空间复杂性: O(K)
Pro&amp;缺点: -
方法1:将此方法用于小整数范围,因为它需要更大的空间,但速度非常快且随机。
方法2:将此方法用于更大的范围,因为它需要您选择的内存O(K)。 k越高,生成的数字的随机性越高。因此,您可以在空间和随机性之间取得良好的折衷,同时保持良好的速度。
答案 3 :(得分:0)
像这样创建一个ArrayList:
索引0-&gt;索引1-&gt;索引2 ...
[1] - &gt; [2] - &gt; [3] ...
生成0和list.size()之间的随机索引值并获取列表中的位置:
yourNumberResult = get(randomIndexValue)。
然后删除列表中的位置:
list.remove(randomIndexValue)
然后在迭代中重复此操作,直到list.size()== 0
答案 4 :(得分:0)
按排序顺序为数字1到9生成数组。
int arr[]=new int[9];
for(int i=0;i<9;i++)
arr[i]=i+1;
现在shuffle
给定的数组。
如何随机播放数组?
To shuffle an array a of n elements (indices 0..n-1):
for i from n - 1 downto 1 do
j = random integer with 0 <= j <= i
exchange a[j] and a[i]
参考
答案 5 :(得分:0)
使用Java 8,Enne的方法可以这样写:
private static List<Integer> generateRandom( int low, int high )
{
List<Integer> range = IntStream.range( low, high ).boxed()
.collect( Collectors.toList() );
Collections.shuffle( range );
return range;
}
答案 6 :(得分:0)
public ArrayList<Integer> getRandom(int numbers,int min_value, int max_value)
{
HashSet<Integer> list = new HashSet<>();
Random r = new Random();
while (list.size()<numbers) {
list.add(r.nextInt(max_value - min_value) + min_value);
}
return new ArrayList<>(list);
}
替代:
public ArrayList<Integer> getRandom(int numbers,int min_value, int max_value)
{
Random r = new Random();
ArrayList<Integer> list = new ArrayList<>();
for(int i=min_value; i<=max_value;i++)
list.add(i);
while (list.size()>numbers) {
list.remove(r.nextInt(list.size()));
}
Collections.shuffle(list);
return list;
}
替代:
public ArrayList<Integer> getRandom(int numbers, int min_value, int max_value) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = min_value; i <= max_value; i++) {
list.add(i);
}
Collections.shuffle(list);
return new ArrayList<>(list.subList(0, numbers));
}