C#生成不重复随机数(随机宝箱)

今天在做礼包系统的时候,有一个看起来很简单的需求。
在十二个礼包里随机挑选四个作为特殊奖励礼包。
这个需求乍一看很简单。
无非就是在1-12中random一个数,然后再判定一下这个数有没有已经随机过。如此重复四次。
实现起来得两个for循环嵌套。
确实是很简单,但也很麻烦。
懒狗还是想找找有没有一行就可以解决的办法。
在替换了诸多关键词后,终于被我找到了。

效果为在1-12中随机挑选4个数并编入数组。

int[] selectNumArray = Enumerable.Range(1, 12).OrderBy(t => Guid.NewGuid()).Take(4).ToArray();

EnumerableLinq中常用的一个类,提供一组用于查询实现 IEnumerable 的对象的 static(在 Visual Basic 中为 Shared)方法。
而本文用到的Enumerable.Range方法可以很方便地生成一个指定范围内的连续整数的序列。
//返回一个起始值为startValue,终止值为endValue的连续整数序列。

Enumerable.Range(startValue, endValue)

如果将其转换为数组则等效于int[].
下列中的两个数组其实是等价的。

int[] NumArray1 = Enumerable.Range(1, 4).ToArray();
int[] NumArray2 = new int[4]{1,2,3,4};

也可以看出在处理和连续整数有关的数据上Enumerable.Range较之int[]有着简洁的优势。
OrderBy()排序,Guid.NewGuid()生成唯一序列 这些就毋庸赘述了。

int[] selectNumArray = Enumerable.Range(1, 12).OrderBy(t => Guid.NewGuid()).Take(4).ToArray();

整行代码的逻辑即:生成一个1至12的连续整数序列,然后再逐个生成唯一标识符并以此来排序,以实现乱序的效果,再取后四位出来,即1-12中的随机四个数,再将其转成数组。

文中有错误或表述不清的希望大家多多指出,谢谢。

你可能感兴趣的:(游戏开发,C#,c#,linq,unity)