【问题标题】:Java: create array with random int's (int's can only be used once)Java:使用随机整数创建数组(整数只能使用一次)
【发布时间】:2011-12-17 22:24:07
【问题描述】:

我有一个名为arr 的数组,有15 个元素。 我需要将数字 1 到 15 以随机顺序放入该数组中。 这是我尝试过的:

int[] arr = new int[15];
int i,j,k,n;

for (i = 0; i<15; i++) {
    for (j=0; j<15; j++) {
        n = (int)(Math.random() * 14 + 1);
        if (rij[j] != n) {
            rij[i] = n;
            break;
        }
    }
}

谢谢! :)

【问题讨论】:

  • 它做你想做的事吗?
  • 不,否则我不会发布它:p
  • 问题的意思是,您应该澄清问题所在:编译时错误、异常、错误消息、错误结果(哪个输入、哪个输出、预期输出),否结果,...

标签: java algorithm random sorting


【解决方案1】:

使用ArrayList 并填写数字 1 到 15。

Shuffle 列表。

将其转换为array

【讨论】:

  • 啊,你也有同样的想法 :-)
【解决方案2】:

这样做

// Create an ordered list
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 16; i++) {
    list.add(i);
}

// Shuffle it
Collections.shuffle(list);

// Get an Integer[] array
Integer[] array1 = list.toArray(new Integer[list.size()]);

// Get an int[] array
int[] array2 = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
    array2[i] = list.get(i);
}

【讨论】:

    【解决方案3】:

    这将使元素随机排列在Integer[] 中,如果您觉得这样的话:

    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < 15; i++)
        list.add(i + 1);
    
    Collections.shuffle(list);
    Integer[] arr = list.toArray(new Integer[0]);
    

    【讨论】:

      【解决方案4】:

      我会这样做:

      首先创建一个从头到尾填充数字的临时数组列表,然后使用随机选择一个数字,将其复制到数组中并从临时数组列表中删除,重复直到数组列表为空...

          ArrayList<Integer> arr = new ArrayList<Integer>();
          int[] arr2 = new int[15];
          int i,j,k,n;
      
          for (i=0;i<15;i++) arr.add(i+1);
          i=0;
          while(arr.size()>0){                    
               n = (int)(Math.random() * (14 + 1 - i));
               arr2[i]=arr.get(n);
               arr.remove(n);
               i++;
          }   
      

      【讨论】:

        【解决方案5】:

        这似乎是家庭作业(或面试问题?)。如果是这种情况,并且您需要使用数组而不是 Java 集合对象的内置方法,(或者即使不是,真的),答案是 Fisher-Yates Shuffle algorithm

        现代的就地洗牌是:

        To shuffle an array a of n elements (indexes 0..n-1):
        for i from n − 1 downto 1 do
           j ← random integer with 0 ≤ j ≤ i
           exchange a[j] and a[i]
        

        (我必须检查一下,但我怀疑这是 Java 在其 shuffle() 方法的底层使用的)。

        编辑,因为实现算法很有趣:

        在java中,这将是:

        public static void main(String[] args) {
        
            int[] a = new int[15];
            for (int i = 1; i <= 15; i++)
            {
                a[i-1] = i;
            }
        
            Random rg = new Random();
            int tmp;
            for (int i = 14; i > 0; i--)
            {
                int r = rg.nextInt(i+1);
                tmp = a[r];
                a[r] = a[i];
                a[i] = tmp;
            }
        
            for (int i = 0; i < 15; i++)
                System.out.print(a[i] + " ");
        
            System.out.println();
        
        
        }
        

        而且...这可以使用算法的由内而外的版本进一步优化,因为您希望以随机顺序插入一系列已知的数字。 以下是实现您所说的想要做的最佳方式,因为没有额外的副本,例如在创建 ArrayList 并将其复制回数组时

        a = new int[15];
        Random rg = new Random();
        for (int i = 0; i < 15; i++)
        {
            int r = rg.nextInt(i+1);
            a[i] = a[r];
            a[r] = i+1;
        }
        

        【讨论】:

        • 无论哪种方式 - 这就是您要了解如何做到这一点的算法:)
        • 最后一次编辑显示了执行您最初声明想要执行的操作的最佳方式;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-10
        • 2015-12-21
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        相关资源
        最近更新 更多