洗牌算法js_数据库洗牌算法

洗牌算法js_数据库洗牌算法文章目录代码实践源码代码实践 Randomrand=newRandom();Integer[]ia={0,1,2,3,4,5,6,7,8,9};Listlist=newArrayList(Arrays.asList(ia));…

大家好,我叫大鸡腿,大家可以关注下我,会持续更新技术文章还有人生感悟,感谢~

在这里插入图片描述

文章目录

  • 代码实践
  • 源码

代码实践

				Random rand=new Random();
                Integer[] ia={0,1,2,3,4,5,6,7,8,9};
                List<Integer> list=new ArrayList<Integer>(Arrays.asList(ia));
                System.out.println("Before shufflig: "+list);
                Collections.shuffle(list,rand);
                System.out.println("After shuffling: "+list);
                System.out.println("array: "+Arrays.toString(ia));
                List<Integer> list1=Arrays.asList(ia);
                System.out.println("Before shuffling: "+list1);
                Collections.shuffle(list1,rand);
                System.out.println("After shuffling: "+list1);
                System.out.println("array: "+Arrays.toString(ia));

你可以发现Random的种子一样的话,每次出来的数组顺序是一样的,这就是伪随机了。

new Random(47);

源码

@SuppressWarnings({"rawtypes", "unchecked"})
    public static void shuffle(List<?> list, Random rnd) {
        int size = list.size();
        if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
            for (int i=size; i>1; i--)
                swap(list, i-1, rnd.nextInt(i));
        } else {
            Object arr[] = list.toArray();

            // Shuffle array
            for (int i=size; i>1; i--)
                swap(arr, i-1, rnd.nextInt(i));

            // Dump array back into list
            // instead of using a raw type here, it's possible to capture
            // the wildcard but it will require a call to a supplementary
            // private method
            ListIterator it = list.listIterator();
            for (int i=0; i<arr.length; i++) {
                it.next();
                it.set(arr[i]);
            }
        }
    }

重点代码

swap(list, i-1, rnd.nextInt(i));
public static void swap(List<?> list, int i, int j) {
        // instead of using a raw type here, it's possible to capture
        // the wildcard but it will require a call to a supplementary
        // private method
        final List l = list;
        l.set(i, l.set(j, l.get(i)));
    }

这不就是特定位置的值跟另一个随机位置的值交换么,哈哈。

list.set()返回之前该位置的值,也就是两个位置互换~

今天的文章洗牌算法js_数据库洗牌算法分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/57897.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注