问题描述
前一阵子想买个大了透玩玩,可是选号这个过程对我这个选择恐惧症的人来说太难了,因此想写个程序帮忙选定。大了透规则如下:
大乐透投注区分为前区号码和后区号码,前区号码范围为01~35,后区号码范围为01~12。大乐透每期从35个前区号码中开出5个号码,从12个后区号码中开出2个号码作为中奖号码,大乐透玩法即是竟猜开奖号码的5个前区号码和2个后区号码,顺序不限。
解题思路
由规则不难看出,我们需要从1-35中选取5个互不相同的随机数,从1-12中选取两个互不相同的随机数,我们可以通过生成随机数的函数rand()以及srand()来实现,函数的具体用法请见:rand函数介绍
最简单的方法即每产生一个随机数便与之前的数进行对比,如果相同便重新生成,直至不同为止。然而,这种方法有可优化的方法吗?
思路优化
当然,上面这种思路是可以实现的,但是每次随机生成一个随机数都要判断在结果集合中是否已经存在这个数,如果存在还要继续下一个循环,这样一来并不是每一轮循环都能生成一个有效(即不重复)的随机数,但实际在内部还是要通过循环来判断,效率还是较低。假如有一天有个人看到这篇文章,他想:很好,我终于可以试试了,我要从1到10000个数中取出9999个不重复的随机数,用上面的这个方法,可能很长