(21)多线程实例应用:双色球(6红+1蓝)

    


一、需求


    1.双色球: 投注号码由6个红色球号码和1个蓝色球号码组成。
    
    2.红色球号码从01--33中选择,红色球不能重复。
    
    3.蓝色球号码从01--16中选择。
        
    4.最终结果7个号码:6+1;即33选6(红)+ 16选1(蓝)
        
    5.产品: 
        能用;用户放心使用;
        原则:靠运气,不能有暗箱操作,号码开奖的随机性。
        
    6.做法思路:
        (1)从左往右---有序变化
        (2)从右往左---有序变化
        (3)同一时刻,球号码都变化~~
        (4)可以做到让所有的球都变化,且都是相互独立的变化,随机性(推荐)


二、程序


    1、界面:6个红球label显示LblRedNum1-LblRedNum6,一个蓝球LblBlue。
        两个Button,BtnStart与BtnStop。一个listBox1.


        
    2、代码:

        private string[] redNums = Enumerable.Range(1, 33).Select(i => i.ToString("00")).ToArray();private string[] blueNums = Enumerable.Range(1, 16).Select(i => i.ToString("00")).ToArray();private object lockObj = new object();private List<Task> tasks = new List<Task>();private CancellationTokenSource cts;private async void BtnStart_Click(object sender, EventArgs e){BtnStart.Enabled = false;BtnStop.Enabled = true;cts = new CancellationTokenSource();CancellationToken ct = cts.Token;//初始化,置00foreach (Label lbl in Controls.OfType<Label>().Where(b => b.Name.Contains("Red"))){ lbl.Text = "00"; }//开7个线程foreach (Label lbl in Controls.OfType<Label>()){if (lbl.Name.Contains("Blue")){tasks.Add(Task.Run(async () =>//蓝球显示{while (!ct.IsCancellationRequested){await Task.Delay(200);string strBlue = blueNums[GetRandom(0, 16)];lbl.Invoke(new Action(() =>{lbl.Text = strBlue;}));}}));}else{tasks.Add(Task.Run(async () =>//红球显示{while (!ct.IsCancellationRequested){await Task.Delay(200);int idx = GetRandom(0, 33);string strRed = redNums[idx];lock (lockObj){List<string> list = GetCurNumList();if (!list.Contains(strRed)){lbl.Invoke(new Action(() => { lbl.Text = strRed; }));redNums[idx] = strRed;}}}}));}}await Task.Run(() =>//任务取消时显示{Task.WaitAll(tasks.ToArray());Invoke(new Action(() =>{List<string> list = new List<string>();foreach (Label lbl in this.Controls.OfType<Label>().Where(b => b.Name.Contains("Red"))){list.Add(lbl.Text);}list.Sort();list.Add(LblBlue.Text);listBox1.Items.Add(string.Join(",", list.ToArray()));}));});}private List<string> GetCurNumList()//返回当前红球列表{List<string> list = new List<string>();foreach (Label lbl in this.Controls.OfType<Label>().Where(b => b.Name.Contains("Red"))){ Invoke(new Action(() => { list.Add(lbl.Text); })); }return list;}private int GetRandom(int min, int max)//产生强随机数{byte[] bytes = new byte[4];using (var rng = RandomNumberGenerator.Create()){ rng.GetBytes(bytes); }int seed = BitConverter.ToInt32(bytes, 0);return new Random(seed).Next(min, max);}private void BtnStop_Click(object sender, EventArgs e){cts.Cancel();BtnStart.Enabled = true;BtnStop.Enabled = false;}private void Form1_Load(object sender, EventArgs e){ BtnStop.Enabled = false; }


三、细节


    1、创建两个数组,根据随机产生的索引,从而得到随机的数。
        比如,随机产生索引3,那么对于红球redNum[3]就是随机的产生的数
        
        随机数用强随机数。根据自定义返回对应的字节。因为需要种子seed是int,所以需要4个字节即可,然后用BitConvert静态函数转换得取seed,从而产生较为真实的随机数。
        
    2、蓝球用一个线程,红球用6个线程同时运行。
        蓝球,不用管。
        红球来自01-33不能重复,因此每次都得从6个红球中比较是否有相同的,相同则再次重新产生,直到得到6个不同的数为止。
        6个线程一样这样操作,但容易竞争,比如都比较出与当前6个label数字不一样的,但这两个线程都产生的是相同的数字,比如是5,那么最后就会有重复的情况,为此设置互斥锁,产生数字时只准一个线程进去,改变当前label列表后,再退出,第二个线程再进去比较,得出不同后更新列表,再退出,如此循环,可使当前label的数字一直不同。
        
    3、结果显示。
        为了防止死锁,开一个子线程来等待前面7个线程的结束,并使用await防止假死。
        
        另外,对6个红球排序后,把蓝球放在最末,加入listbox1显示。(不能全部排序,红蓝是两部分)
    
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/133567.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套

蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套 第十四届蓝桥杯省赛真题 1、要把下面4张图片重新排列成蜗牛的画像,该如何排列这些图片 A、 B、 C、 D、 答案:A 考点分析:主要考查小朋友们的观察能力空

搭建自己的OCR服务,第一步:选择合适的开源OCR项目

一、OCR是什么&#xff1f; 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;是指对文本资料的图像文件进行分析识别处理&#xff0c;获取文字及版面信息的过程。 亦即将图像中的文字进行识别&#xff0c;并以文本的形式返回。 二、OCR的基本流程 1…

Truenas scale 配置Zerotier

Zerotier 注册 官网注册 zerotier&#xff0c; Truenas 安装 Zerotier Truenas的 APP -> Available Applications 中搜索 zerotier 在 Network中填入 zerotier 注册账户后给你的ID。 勾选 Host Network 在这里插入图片描述 Zerotier 中给定权限 左侧 框框 打钩&#…

mysql MVCC多版本并发控制

mvcc的概念 mvcc 的实现依赖于&#xff1a; 隐藏字段 行格式&#xff08;row_id,trx_id,roll_ponter&#xff09;UndologRead view innodb 存储引擎的表来说&#xff0c;聚集索引记录中都包含两个必要的隐藏字段&#xff0c;row_id(如果没有聚集索引&#xff0c;才会创建的) …

春秋云镜 CVE-2013-2134

春秋云镜 CVE-2013-2134 S2-015 靶标介绍 2.3.14.3 之前的 Apache Struts 2 允许远程攻击者通过标记在通配符匹配期间未正确处理的所提出的操作名称的请求执行任何 OGNL 代码&#xff0c;这是与 CVE-2013-2135 不同的漏洞。 启动场景 漏洞利用 工具利用 得到flag flag{b92…

Say0l的安全开发-代理扫描工具-Sayo-proxyscan【红队工具】

写在前面 终于终于&#xff0c;安全开发也练习一年半了&#xff0c;有时间完善一下项目&#xff0c;写写中间踩过的坑。 安全开发的系列全部都会上传至github&#xff0c;欢迎使用和star。 工具链接地址 https://github.com/SAY0l/Sayo-proxyscan 工具简介 SOCKS4/SOCKS4…

flutter产物以aar形式嵌入android原生工程

以前做的项目中&#xff0c;flutter都是作为module嵌入原生工程中&#xff0c;新公司项目却是以aar形式嵌入android工程&#xff0c;这种优点是原生工程不必配置flutter环境也能跑了&#xff0c;这里记录一下简单步骤。 创建一个flutter module 通过android studio创建一个fl…

天翎知识管理系统:智能化搜索引擎,快速定位知识资源

关键词&#xff1a;知识管理系统、全文检索 编者按&#xff1a;在当今知识经济时代&#xff0c;企业所面临的知识资源越来越丰富&#xff0c;如何高效地管理和利用这些资源成为了一个重要的问题。天翎知识管理系统凭借其智能化搜索引擎&#xff0c;可以帮助企业快速定位知识资源…

RabbitMQ及各种模式

目录 一、MQ的基本概念 1.1 MQ概述 1.2 MQ的优势和劣势 1.3 MQ的优势 1.应用解耦 2.异步提速 3.削峰填谷 1.4 MQ的劣势 小结 1.5 常见的 MQ 产品 1.6 RabbitMQ 简介 1.7 JMS 小结 二、RabbitMQ管控台 三、Hello World简单模式 ​编辑 1、生产者 ​编辑 2、消费…

Mac 安装软件各种报错解决方案

Mac 安装软件各种报错解决方案 文章目录 Mac 安装软件各种报错解决方案一. 打开允许“允许任何来源”二. 无法打开"xxx"&#xff0c;因为它不是从App Store下载三. 无法打开"xxx"&#xff0c;因为 Apple无法检查其是否包含恶意软件。四. "xxx"已…

详解初阶数据结构之顺序表(SeqList)——单文件实现SeqList的增删查改

目录 一、线性表 二、顺序表 2.1概念及结构 2.2接口实现 2.3动态顺序表的创建 2.3动态顺序表的初始化 2.3.1传值初始化 2.3.2传址初始化 2.4动态顺序表的清空 2.5动态顺序表的扩容 2.6动态顺序表内容的打印 三、动态顺序表的使用 3.1尾插尾删 3.1.1尾插 3.1.2尾删…

Echarts 雷达图的详细配置过程

文章目录 雷达图 简介配置步骤简易示例 雷达图 简介 Echarts雷达图是一种常用的数据可视化图表类型&#xff0c;用于展示多个维度的数据在同一坐标系下的分布情况。雷达图通过不同的坐标轴表示不同的维度&#xff0c;数据点的位置表示了各个维度的数值大小。 Echarts雷达图的…

微信小程序中 vant weapp 使用外部的icon作为图标的步骤

微信小程序中 vant weapp 使用外部的icon作为图标的步骤 1. 在项目中创建静态资源文件夹2. 前往iconfont图标官网&#xff0c;添加图标并拷贝在线链接3. 下载iconfont代码&#xff0c;解压之后拷贝到小程序的目录中4. 修改iconfont.wxss 将本地链接替换为在线链接5. 在项目的ap…

【Transformer系列】深入浅出理解Tokenization分词技术

一、参考资料 NLP技术中的Tokenization是什么&#xff1f;核心任务是什么&#xff1f; 二、Tokenization相关介绍 1. Tokenization的概念 NLP技术中Tokenization被称作是“word segmentation”&#xff0c;直译为分词。具体来说&#xff0c;分词是NLP的基础任务&#xff0c…

机器学习(15)---代价函数、损失函数和目标函数详解

文章目录 一、各自定义二、各自详解三、代价函数和损失函数区别四、例题理解 一、各自定义 1. 代价函数&#xff1a;代价函数&#xff08;Cost Function&#xff09;是定义在整个训练集上的&#xff0c;是所有样本误差的平均&#xff0c;也就是损失函数的平均。它用于衡量模型在…

如何应对数字时代的网络安全新挑战?

随着数字时代的来临&#xff0c;我们迎来了无限的机遇&#xff0c;同时也伴随着网络安全领域新的挑战。网络攻击变得更加智能化和复杂化&#xff0c;威胁也在不断演化。为了应对这些新挑战&#xff0c;我们必须采取创新的网络安全策略和技术。本文将探讨数字时代网络安全的新挑…

JVM 篇

一、知识点汇总 其中内存模型&#xff0c;类加载机制&#xff0c;GC是重点方面。性能调优部分更偏向应用&#xff0c;重点突出实践能力。编译器优化和执行模式部分偏向于理论基础&#xff0c;重点掌握知识点。 内存模型&#xff1a;各部分作用&#xff0c;保存哪些数据。类加载…

go-GMP和Scheduler

GPM模型 G 待执行的goroutine&#xff0c;结构定义在runtime.g M 操作系统中的线程&#xff0c;它由操作系统的调度器 进行 调度和管理, 结构定义在runtime.m P 处理器&#xff0c;是GM的中间件&#xff0c;它通过一个队列绑定了GM&#xff0c;每个P都有一个局部queue&#x…

Vue.js新手指南:从零开始建立你的第一个应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

编程获取图像中的圆半径

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 即将推出EmguCV的教程&#xff0c;请大家还稍作等待。 之前网友咨询如何获得图像中圆形的半径&#xff0c;其中有两个十字作为标定…