生成唯一的随机数

时间:2014-07-01 11:06:49

标签: java algorithm random

如何在1到9之间生成9个随机数,不重复,一个接一个。就像是: 假设生成的第一个随机数是4,那么下一个随机数必须在[1,9] - {4}中。 我的第一种方法是将每个随机生成的数字添加到一个集合中,从而避免重复。但是在更糟糕的情况下,就像我们已经生成6并且我们必须再生成3个数字一样,这个过程有点慢。当范围从[1,9]变为[1,1000]时,这种方法听起来并不正确。 任何人都可以提出另一种方法。

7 个答案:

答案 0 :(得分:5)

从排序数组开始(通过for循环很容易创建);然后shuffle bey用另一个(随机选择的)元素交换每个数组元素。 为避免评论中讨论的偏见,其他元素的索引必须等于或高于第一个元素的索引。 如果索引相等,则不交换元素。 (这个答案的原始版本包含一个关于元素被换回的可能性的句子,但现在已经过时了,因为突然修改后不再发生这种情况)

答案 1 :(得分:4)

如果您对实现自己想做的算法不感兴趣,可以使用已经在Java库中实现的简单方法。

您可以创建ListIntegerstart的集合(已排序end),其中start=1end=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: -

  
      
  1. 将所有数字放在大小为n的数组中。
  2.   
  3. 随机选择一个数字索引i = rand(0,size)
  4.   
  5. print arr [i]
  6.   
  7. swap arr [i]和arr [size-1]
  8.   
  9. size = size -1
  10.   
  11. 重复1到5,直到列表用尽。
  12.   

时间复杂度: O(N)

空间复杂性: O(N)

方法2: -

  
      
  1. 选择K的池大小。
  2.   
  3. 生成K个随机整数。
  4.   
  5. 将它们显示为第一个k结果。
  6.   
  7. 将它们添加到哈希集。
  8.   
  9. 为池中的所有先前整数添加所有ak + 1。
  10.   
  11. 如果它不在hashset中,请加1。
  12.   
  13. 从池中随机选择一个整数r并显示它。
  14.   
  15. 如果r + 1不在hashset中,则将其添加到池中
  16.   
  17. 做到7到8,直到游泳池用尽。
  18.   

时间复杂度: 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]

参考

http://www.geeksforgeeks.org/shuffle-a-given-array/

答案 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));
}