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

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

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

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

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

Enumerable.Range(startValue, endValue)
  • 1

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

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

  • 2

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值