zoukankan      html  css  js  c++  java
  • 将一个数组进行随机再排列

    这是我们的第一篇博文,也是我们在开发第一个app的时候遇到的一个比较有趣的算法,这种将一个数组重新进行随机排序的问题并不罕见,但是因为是初学者,所以在探讨这个算法的过程中也纠结了很久,当然最后的算法也是参考借鉴了且听风吟博主的一篇文章:http://wsjiang.iteye.com/blog/1775341,在此鸣谢!

    问题的解决:

    1、假设想要将2~7这6个数字随机排序成一个数组,这里我们设置min为该范围的最小值2,max为该范围的上限7,n为想要在这个范围中取出多少个数字组成一个数组,当然当n等于范围的长度len即6时,那么得到的就是将原来的6个数字重新随机排序一遍。

    2、为了方便我们引进一个初始化数组source,并将刚刚范围中的所有数字依次存进该数组中,则初始化数组source为{2,3,4,5,6,7}。

    3、为了方便我们同样再引进另一个数组result作为最后返回的数组。在这里我们知道一开始len=6,那么就随机取得一个随机数index(0<=index<=len-1),接下来就要在source数组中找到index位置上的元素放入到result数组的第0位,这时应该将len自减,同时在source数组中将source[index]替换为source[len]。

    4、以此类推直到数组result已满位置。最终得到的就是一个经过随机排序的数组。

    java代码如下:

     1 public class TestRandom {
     2     /**
     3      * 该方法用于在制定范围即(min~max)内对min到max的所有数字进行重新随机排列,使他们形成一组随机数。
     4      *  1、首先先初始化一个长度为(max-min+1)的数组source,数组的元素按照数字从大到小的顺序分别为min~max;
     5      *  2、每次取一个随机数index,0<=index<=(数组长度len-1),同时len自减1,
     6      *  取出source数组中对应在index位置上的元素依次放进最终数组result,并且将source[index]替换为source[len]。
     7      **/
     8 
     9     public static int[] randomArray(int min,int max,int n){
    10         int len = max-min+1;//len为该范围内元素的个数
    11 
    12         if(max < min || n > len){
    13             return null;
    14         }
    15 
    16         //初始化给定范围的待选数组
    17         int[] source = new int[len];
    18         for (int i = min; i < min+len; i++){
    19             source[i-min] = i;
    20         }
    21 
    22         int[] result = new int[n];
    23         Random rd = new Random();
    24         int index = 0;
    25         for (int i = 0; i < result.length; i++) {
    26             //待选数组0到(len-2)随机一个下标
    27             index = Math.abs(rd.nextInt() % len--);
    28             //将随机到的数放入结果集
    29             result[i] = source[index];
    30             //将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换
    31             source[index] = source[len];
    32         }
    33         return result;
    34     }
    35     public static void main(String[] args) {
    36         for (int i = 0; i<=5; i++) {
    37         int result[]=TestRandom.randomArray(2,7,6);
    38             for (int num:result) {
    39                 System.out.print(num+"	");
    40             }
    41             System.out.println();
    42         }
    43     }
    44 }

    运行结果如图,可见每次运行的结果都有可能不一样。

                            

                                                                        2016-04-03

                                                                          BOB

  • 相关阅读:
    Linux网络基础配置
    UVA 116 Unidirectional TSP(dp + 数塔问题)
    修改Hosts文件
    倒排索引
    可以把阿里云上面的一些介绍和视频都看看
    练练脑,继续过Hard题目
    explicit的用法
    auto_ptr的使用和注意
    我写的快排程序
    快速排序、查第k大
  • 原文地址:https://www.cnblogs.com/ghylzwsb/p/5351038.html
Copyright © 2011-2022 走看看