今夜练习代码的时候发生了一件趣事……

一、代码展示


代码要求:说白了,数组内元素不重复地随机排列

我看的是,黑马程序员的视频,练习也在这http://【黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)】 https://www.bilibili.com/video/BV17F411T7Ao/?p=78&share_source=copy_web&vd_source=b98779387f2578b3b42a5d3a32904346


练习时跟着敲下的代码如下:


import java.util.Random;

//数组内数据随机排列
public class test10 {
    public static void main(String[] args) {
        //定义一个数组,存储五个数据
        int [] arr = {2,588,888,1000,10000};
        int[] newArr = new int[arr.length];
        Random r = new Random();
        for (int i = 0; i < arr.length;) {
            int index = r.nextInt(arr.length);
            int prize = arr[index];
            boolean flag = comtains(newArr,prize);
            if(!flag) {
                newArr[i] = prize;
                i++;
            }
        }
        for (int i = 0; i < newArr.length; i++) {
            System.out.println(newArr[i]);
        }
    }


    public static boolean comtains(int[] arr,int prize) {
        for (int i = 0; i < arr.length; i++) {
            if(prize == arr[i]) {
                return true;
            }
        }
        return false;
    }
}

而我的代码:


import java.util.Random;

public class code{
    public static void main(String[] args){
        //定义一个数组,存储五个数据
        int [] arr = {2,588,888,1000,10000};

        //实现数组内元素随机排列
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            int index = r.nextInt(arr.length);
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

        我当时写完也是感觉好奇怪,为什么我的也可以实现?打了断点,调试了进二十分钟发现确实是可行的,但你要问我为什么?我只能说,我们都在用力地写代码……

        问了AI,感觉也很晦涩……回答如下:


        在`code.java`中,我们使用的是Fisher-Yates洗牌算法的一种变体来实现数组的随机排列。这个算法的核心思想是遍历数组的每一个元素,然后将当前元素与一个随机选中的元素(包括它自己)进行交换。具体实现如下:

```JAVA
Random r = new Random();
for (int i = 0; i &lt; arr.length; i++) {
    int index = r.nextInt(arr.length);
    int temp = arr[i];
    arr[i] = arr[index];
    arr[index] = temp;
}
```

这个算法保证了每个元素都有相同的机会出现在数组的每一个位置上,因此不会出现重复的结果。具体来说,对于数组中的每一个元素,都有可能被交换到数组的任何一个位置,包括它自己的位置。因此,数组的所有可能的排列都是等概率的。

        Fisher-Yates洗牌算法是一种用于生成一个有限序列的随机排列的算法。它通过遍历序列的每一个元素,然后将当前元素与一个随机选中的元素(包括它自己)进行交换,从而实现随机排列。

这个算法之所以能够保证不重复,主要在于它的两个核心特性:

  1. 每个元素都有相同的机会出现在序列的每一个位置上:在算法的每一步,我们都会随机选择一个位置,然后将当前元素与这个位置上的元素进行交换。这意味着,对于序列中的每一个元素,都有可能被交换到序列的任何一个位置,包括它自己的位置。因此,序列的所有可能的排列都是等概率的。

  2. 每次交换都是独立的:在算法的每一步,我们都会独立地进行一次交换操作。这意味着,我们不会因为之前的交换操作而影响到当前的交换操作。因此,我们不会出现重复的元素。

        具体来说,假设我们有一个包含n个元素的序列,那么这个序列的所有可能的排列就有n!(n的阶乘)种。而在Fisher-Yates洗牌算法中,我们每一次交换操作都有n种可能的结果,因此,总的可能结果就有n * n * ... * n = n^n种。由于n^n = n!,所以Fisher-Yates洗牌算法能够生成所有可能的排列,从而保证不重复。


        看完原地爆炸,卧槽?!太看得起哥们儿了😁(有点头绪了🥹)


出发!!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值