- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
不重复随机数产生问题
C#的解题思路(1):不重复随机数的产生问题
2010-08-20 07:20:08
标签: HYPERLINK /tagindex.php?keyword=%CB%E6%BB%FA%CA%FD \t _blank 随机数 HYPERLINK /tagindex.php?keyword=%CB%BC%C2%B7 \t _blank 思路 HYPERLINK /tagindex.php?keyword=%B2%BB%D6%D8%B8%B4%CB%E6%BB%FA%CA%FD \t _blank 不重复随机数 [ HYPERLINK / \l # 推送到技术圈]
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 HYPERLINK /792419/380423 \t _blank 原始出处 、作者信息和本声明。否则将追究法律责任。 HYPERLINK /792419/380423 /792419/380423
?
说明:写作本文的出发点是最近和一个有3年开发经验的.NET开发人员聊天,他跟我说经常没有思路,在实际开发中我也见过一个具有4、5年开发经验的开发人员几乎没有灵活变通的能力,所以打算写一系列文章,在这个系列文章中我会主要讲解解题的思路,而不是讲述什么新技术新特性,借这个系列文章为初中级开发者了解遇到问题别人是如何思考和解决的。当然,如果你的思路比本文提到的更好,欢迎指出来,同时如果你对本系列文章有更好的建议或者有日常中的一些典型问题,请给我联系,我们共同探讨。目前我暂时能想到的有不重复随机数产生问题、字符串与数值转换的问题、特殊的数据库锁问题、访客来路追踪问题、在线用户统计问题、统计用户访问页面偏好问题。
好了,我现在开始本篇的讲述。本篇的最原始形态是来源于我早年做的一个Java SE应用软件,它是用来模拟彩票投注站的选好软件的。应为在早年Java SE中用swing做界面布局是一件比较痛苦的事情,所以后来我重新用C#做了一个。这个问题的原型就是解决双色球随机选号的问题,我们知道双色球红色球共包含1到33这33个红色号码球及1到16这16个蓝色号码球,一注双色球号码应包括6个红色球号码和1个蓝色球号码。蓝色号码球很好解决,随机从1到16这16个数字中随机选取一个就行了。但是红色球就存在这样一样问题,每次选取的红色球不能与本注中已经选取的号码重复,这个问题归结为生成不重复随机数问题。
在本篇我就怎么生成不重复的红色球展开讨论。
解题思路一
在早期的Java中不包含泛型,只能使用ArrayList,所以我是用ArrayList来实现的。在Java中的ArrayList和C#中的ArrayList在用法上是很相似的(这就是为什么高手经常说掌握一门语言之后再去掌握另一门语言是很容易的事情,应为思想是相通的,呵呵)。在这里我最想想到的就是使用循环,每次循环中随机生成一个随机数,判断一下这个随机数是否已经在本注中使用,如果没有使用就将这个号码保存到结果中去,反之则进行下一轮循环,循环的结束条件就是生成了满足要求的6个数字。接触到泛型之后,我知道在这里我所使用的数据类型是int类型(当然也可以使用byte类型),如果使用ArrayList保存int这样的值类型数据会存在着装箱和拆箱操作,带来不必要的性能损失,所以针对这种集合中数据类型单一的情况可以考虑泛型集合,于是得到了下面的代码:
?
///?summary??? ?
///?从1到33中任意选取不重复的6个随机数??? ?
///?/summary??? ?
///?returns/returns??? ?
public?Listint?GenerateNumber1()??? ?
{??? ?
????//用于保存返回的结果??? ?
????Listint?result?=?new?Listint(6);??? ?
????Random?random?=?new?Random();??? ?
????int?temp?=?0;??? ?
????//如果返回的结果集合中实际的元素个数小于6个??? ?
????while?(result.Count??6)??? ?
????{??? ?
????????//在[1,34)区间任意取一个随机整数??? ?
????????temp?=?random.Next(1,?34);??? ?
????????if?(!result.Contains(temp))??? ?
????????{??? ?
????????????//如果在结果集合中不存在这个数,则添加这个数??? ?
????????????result.Add(temp);??? ?
????????}??? ?
????}??? ?
文档评论(0)