C语言,一个彩票摇奖程序摇出22选5的中奖号码
摇奖机摇奖,无非就是利用它的随机性,让球从摇奖机中随机地掉出,就成了中奖号码。而C语言中也同样有个rand()函数可以产生随机数,利用这个rand()函数产生的随机数,同样可以代替从摇奖机中随机摇出的中奖号码。
然而,我们无法直接使用rand()函数来产生中奖号码,因为rand()产生的随机数字有一定的重复性,也就是rand()也许可以产生两个1,三个2,这显然不符合彩票的规则。那么,如何让rand()产生不重复的随机数字呢?
我们可以回想一下摇奖机是如何工作的:从容器中随机地摇出一个球,然后再从设个拿下的号码球中摇出第二个球。。。以此类推。而在C语言程序中,我们要想产生不重复的随机数字,也可以模仿这个过程来产生随机数字。首先在一个数组balls中保存所有的彩球号码(从1到22),然后,用rand()产生一个数组中号码个数范围内的随机数n(产生一个0到21范围内的随机数),然后用这个数n作为数组下标,从balls数组中取出的数字balls[n]就是摇出的号码,然后复制保存到中奖号码数组winnings中(winning[i]=balls[n]),因为一个号码已经被摇出了,所以我们将末尾的号码复制到已经被摇出的号码的位置(balls[n] = balls[M-i];),这样,这个数组中前面部分的号码依然是有效的,这是可以开始摇第二个球,用rand()产生一个0到20范围的随机数,得到第二个号码,以此类推,我们就可以得到五个随机的不重复的中奖号码了。
根据上面的分析,我们将这个摇奖程序实现如下:
// shuffle.c 福彩摇奖程序
// 中原风采22选5游戏规则
// 中原风采22选5属于低难度乐透型彩票,
// 彩民只需从01至22个号码中任意选出5个号
// 码就可以组成一注。开奖后将投注号码与中
// 奖号码对照,没有特别号码,不排顺序和位置。
#include <stdio.h>
#include <stdlib.h>
// 引入rand(),srand()函数所在头文件
#include <time.h>
const int M = ;
// 号码总数 const
int N = ;
// 摇出的号码数
// 将22个号码装入摇奖机
void init(char* balls )
{
for(int i=;i<M;++i)
{
balls[i] = i + ;
}
}
// 摇奖,将中奖号码摇出到winnings数组 v
void shuffle(char* balls,char* winnings)
{
// 用当前时间初始化随机种子
srand(time(NULL));
// 依次摇出N个中奖号码
for(int i = ; i < N; ++i)
{
// 得到一个0到(M-i)之间的随机数
int n = rand()%(M - i);
// 将摇出的号码复制到winnings保存
winnings[i] = balls[n];
// 用balls末尾的数字填补摇出号码的空位
balls[n] = balls[M-i];
}
}
int main(void)
{
// 准备摇奖
char balls[M];
init(balls);
// 摇啊摇,摇啊摇
char winnings[N];
shuffle(balls,winnings);
// 公布中奖号码,可惜中奖的不是我
puts("winning numbers:");
for(int i = ; i < N; ++i)
{
printf("%d ",winnings[i]);
}
return ;
}
这里大家可能还有个疑问:这种方法,真的能够保证每个号码出现的几率都是一样的吗?比如,我们以数字1为例,1第一次就被摇出的几率,很明显是1/22,假如1第一次没被摇出,那么他第一次不被摇出的几率就是21/22,而这是只剩下了21个球,他第二次别摇出的几率就是1/21?啊,1/21不是比1/22高?几率不均等啊。且慢,虽然1第二次摇出的几率要高,但是这是在第一次不被摇出的基础之上的,所以他实际上第二次被摇出的几率是,(21/22)*(1/21)=1/22,依然是1/22,两次的几率实际上是一样的。
C语言,一个彩票摇奖程序摇出22选5的中奖号码的更多相关文章
- P235 实战练习(集合类2)、摇奖程序和验证码(修改版)
1.分别向Set集合以及List集合中添加“A”.“a”.“c”.“C”.“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. package org.hanqi.practi ...
- C#摇奖程序
private void Form1_Load(object sender, EventArgs e) { //取消跨线层访问控件的判断 Control.CheckForIllegalCrossThr ...
- C语言一个简单的闹钟程序
#include <stdio.h> #include <stdbool.h> #include <Windows.h> ; i < ; ++i) { // ...
- 学了C语言,如何写个程序计算出每个月的第一个星期一对应的日期
在前面,我们分别利用泰勒公式和C标准库中的mktime()函数推算了某个特定日期所对应的星期几,刚做完这些,就又遇到了一个与日期相关的新任务: 老板把每个月例会的时间定在了每个月的第一个星期一,他让我 ...
- [AHOI2001]彩票摇奖
[AHOI2001]彩票摇奖 题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一 项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1 ...
- P1074 彩票摇奖
题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1~33. (2) 每次在兑奖前都 ...
- 题解 P2550 【[AHOI2001]彩票摇奖】
题目链接 大家有没有发现数据范围好小呀 我们只需要开7~8的数组就好!! 中间比较的时候懒得用for循环比较了.直接爆搜. 废话不多说,直接上代码. #include<bits/stdc++.h ...
- php摇杆Tiger摇奖
先说下整体思路,代码已附下方. 1.递归产生一个非中奖数(即非连续数字:'111','222','333','444','555','666','777','888') 2.点击摇奖,把奖项通过设置的 ...
- 异步委托 多线程实现摇奖器 winform版
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
随机推荐
- git用法
chapter: 8 add 添加文件内容至索引 用法:git add [选项] [--] ... -n, --dry-run 演习 -v, --verbose 冗长输出 -i, --interact ...
- homework-02 二维的,好喝的(二维数组的各种子数组)
1)输入部分 对于输入部分,我定义的输入格式是这样的 前两行为列数和行数 如果文件无法打开,或者输入文件格式不对,均会提示出错并退出 2)二维数组的最大矩形子数组 首先,我使用最最简单的暴力算法,直接 ...
- CoolShell Puzzle攻略[更新隐藏剧情]
CoolShell博主陈皓做了一个在线的puzzle很有意思,链接在这里,这里记录一下解题的一些步骤. Puzzle 0 ++++++++[>+>++>+++>++++> ...
- 命令行连接wifi
ubuntu没有图形界面,插入无线网卡后启动不能连接无线. 看这个帖子 http://askubuntu.com/questions/138472/how-do-i-connect-to-a-wpa- ...
- C#委托详解(3):委托的实现方式大全(续)
接上篇(C#委托详解(2):实现方式大全),本篇继续介绍委托的实现方式. 4.Action<T>和Func<T>委托 使用委托时,除了为每个参数和返回类型定义一个新委托类型之外 ...
- 通过手机Web实现手机摇一摇的功能
经常我们玩微信都会用到查到附近的人,都是在app上实现手机摇一摇的功能.现在,我们将此技术搬移到手机web上,供大家学习,主要是用到HTML5的重要特性就是DeviceOrientation:官方文档 ...
- GitHub教程--上传项目四步法 GitBash命令行下使用方法
之前就用过GitHub,感觉用GitHub托管自己的代码非常不错.可是之前用的都是窗口化的TortoiseGit,省了很多命令行的操作,但是个人非常喜欢使用命令行,于是,今天就试着用了用GitBash ...
- Window.document对象(2)
四.操作样式 首先利用元素的ID找到该元素,存于一个变量中: var a = document.getElementById("id"): 然后可以对该元素的属性进行操作: a.s ...
- 浅谈IT
在没有学计算机应用技术之前我对IT的认知度几乎为零,曾经还天真的认为IT就是白领,只要做上IT行业,以后便可高枕无忧.后来阴差阳错学了这个专业.通过一年的学习,虽然学艺不精但多少对IT行业了解的一知半 ...
- Leetcode#138 Copy List with Random Pointer
原题地址 非常巧妙的方法,不需要用map,只需要O(1)的额外存储空间,分为3步: 1. 先复制链表,但是这个复制比较特殊,每个新复制的节点添加在原节点的后面,相当于"加塞"2. ...