纳金网

标题: Unity 从一组数中随机选择几个不同数的算法 [打印本页]

作者: may    时间: 2018-12-31 21:37
标题: Unity 从一组数中随机选择几个不同数的算法

來自:与光同尘

程序:(程序是从网上取的,本篇博客主要总结一下思路与用法)

public int[] GetRandomSequence2(int total, int n)
{
        //随机总数组 int[] sequence = new int[total];
         //取到的不重复数字的数组长度 int[] output = new int[n];
        for (int i = 0; i < total; i++)
        {
                sequence = i;
        }
        int end = total - 1;
        for (int i = 0; i < n; i++)
        {
                //随机一个数,每随机一次,随机区间-1
                int num = Random.Range(0, end + 1);
                output = sequence[num];
                //将区间最后一个数赋值到取到数上
                sequence[num] = sequence[end];
                end--;
                //执行一次效果如:1,2,3,4,5 取到2
                //则下次随机区间变为1,5,3,4;
        }
        return output;
}

原因:之所以把这个程序单独列出来,是因为它与我一开始的想法不一样,之前想的是从一组数中一个一个取值出来,与之前的取出的数作比较取与之前取出数都不相同的值进入取出的数的数组。而这个函数会把之前取出的数放在数组末尾,缩短数组长度以此达到取不同值的结果。其中效率提升很多。
用法:在大量数据中,随机取几个不同的数据。或者打乱当前数据顺序。
实际使用: 生成连连看的阵列,首先从图片库中选出相应数量的图片,打乱次序,根据打乱的次序生成对应的图片。



作者: 745951224    时间: 2019-1-2 09:51
首先说明一点错误,文中的output = sequence[num];是错误的,可能是手误对吧,output是个int数组,不能直接赋值一个数据。
应为output[n] = sequence[num];

这种算法相比于传统的比较数值以及做标记的算法来说,确实能节省程序性能。想法很棒。
但是不足也有:
1、你得把数组提前备份,因为该算法会打乱数据顺序  
2、并没有做安全判定,比如出现误操作n>total
3、参数传入其实不合理,应该是public int[] GetRandomSequence2(int[] array, int n) 比较合理
作者: 745951224    时间: 2019-1-2 09:52
是output[i] = sequence[num]; 上面写错了





欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5