查看: 3062|回复: 2

[经验分享] Unity 从一组数中随机选择几个不同数的算法

[复制链接]
may    

8830

主题

80

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52304
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

发表于 2018-12-31 21:37:12 |显示全部楼层

來自:与光同尘

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

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;
}

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


回复

使用道具 举报

5

主题

7

听众

2429

积分

中级设计师

Rank: 5Rank: 5

纳金币
149
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

发表于 2019-1-2 09:51:08 |显示全部楼层
首先说明一点错误,文中的output = sequence[num];是错误的,可能是手误对吧,output是个int数组,不能直接赋值一个数据。
应为output[n] = sequence[num];

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

使用道具 举报

5

主题

7

听众

2429

积分

中级设计师

Rank: 5Rank: 5

纳金币
149
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

发表于 2019-1-2 09:52:34 |显示全部楼层
是output[i] = sequence[num]; 上面写错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-4-17 03:00 , Processed in 0.086116 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部