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

news2024/9/24 18:17:30

    


一、需求


    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;

            //初始化,置00
            foreach (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.coloradmin.cn/o/1013980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL索引学习】MySQL索引详细学习

一、什么是索引 索引是一种用于快速查询和检索数据的数据结构。 可以将其类比于书的目录。 索引底层的数据结构存在很多种类型&#xff0c;常见的索引结构有: B 树&#xff0c; B树 和 Hash、红黑树。在 MySQL 中&#xff0c;无论是 Innodb 还是 MyIsam&#xff0c;都使用了 …

如何在 Nginx 中隐藏版本号

文章目录 修改nginx.conf文件修改fastcgi.conf文件参考文档 修改nginx.conf文件 打开 Nginx 配置文件&#xff0c;一般在 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf。在 http 块中添加以下内容&#xff1a;server_tokens off;修改fastcgi.conf文件 编辑php…

kafka 消费者的消费策略以及再平衡1

一kafka 再平衡 1.1 kafka的再平衡 Kafka的再平衡是consumer所消费的topic发生变化时&#xff0c;topic上的分区再次分配的情况。 默认策略是 Range CooperativeSticky 。 Kafka 可以同时使用 多个分区分配策略。 1.2 kafka触发再平衡的情况 1.consumer group中的新增或删…

Windows系统webp图片预览插件

由于工作中经常需要对组图查看和管理&#xff0c;而Windows 7系统不支持在文件夹下直接预览webp图片。经过查找&#xff0c;发现 WebP Codec for Windows 扩展插件不错&#xff0c;完美地解决webp图片预览问题。 目录 1、webp文件浏览插件 2、下载插件并安装 3、浏览webp图片…

vue项目部署,出现两个ip的原因

我宁愿靠自己的力量打开我的前途,而不愿求有力者的垂青。——雨果 tags: 篇首语&#xff1a;本文由小常识网(cha138.com)小编为大家整理&#xff0c;主要介绍了vue项目部署&#xff0c;出现两个ip的原因相关的知识&#xff0c;希望对你有一定的参考价值。 参考技术A 在部署v…

Linux网络编程|TCP编程

一.网络基础 1.1网络发展史 Internet&#xff0d;“冷战”的产物 1957年10月和11月&#xff0c;前苏联先后有两颗“Sputnik”卫星上天 1958年美国总统艾森豪威尔向美国国会提出建立DARPA (Defense Advanced Research Project Agency)&#xff0c;即国防部高级研究计划署&#…

机器学习练习-决策树

机器学习练习-决策树 代码更新地址&#xff1a;https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释&#xff1a;黄海广&#xff0c;haiguang2000wzu.edu.cn 1&#xff0e;分类决策树模型是表示基于特征对实例进行分类的树形结构。决策树可以转换成一个if…

Jsoup | Document | HTML解析器

Jsoup 一、获取 <p>标签下的所有图片 一、获取 <p>标签下的所有图片 <p> <img style"max-width: 100%;" src"http://image.svipjf.cn/1678271098160-480_01.jpg"/><img src"http://image.svipjf.cn/1678271097994-480_02…

FPGA project: uart_rs485

没有设计rs485的顶层&#xff0c;因为我的另一块板子没有TTL信号转差分信号的芯片&#xff1a;MAX3485CSA module ctrl(input wire sys_clk ,input wire sys_rst_n ,input wire key_w ,input …

如何使用 RunwayML 进行创意 AI 创作

标题&#xff1a;如何使用 RunwayML 进行创意 AI 创作 介绍 RunwayML 是一个基于浏览器的人工智能创作工具&#xff0c;可让用户使用各种 AI 功能来生成图像、视频、音乐、文字和其他创意内容。RunwayML 的功能包括&#xff1a; * 图像生成&#xff1a;使用生成式对抗网络 (…

零基础也能快速上手活动海报设计

在现代社会中&#xff0c;活动海报设计已经成为推广活动、宣传信息的重要手段之一。然而&#xff0c;对于大部分人来说&#xff0c;设计一张漂亮的海报可能会觉得困难重重。不过&#xff0c;不用担心&#xff01;现在有了乔拓云&#xff0c;零基础的你也能轻松上手活动海报设计…

GraphBase基础原理

一、GraphBase简介 互联网时代&#xff0c;随着网络技术的发展&#xff0c;企业积累的数据越来越多。伴随着数据集的不断增加&#xff0c;传统的关系型数据库查询性能会随之变差&#xff0c;特别是针对一些特殊的业务场景&#xff0c;所以迫切的需要一种新的解决方案去应对这种…

[腾讯云 Cloud Studio 实战训练营] 云上编程的革命:我的 Cloud Studio 体验之旅

文章目录 1. 无缝的云端体验1.1 云端工作站的魅力1.2 真正的在线编程1.3 强大的协作能力1.4 多平台兼容性1.5 安全和数据备份1.6 持续更新和维护1.7 灵活的资源扩展 2. 功能强大的在线 IDE2.1 基础功能全覆盖2.2 高级功能支持2.3 多语言支持2.4 自定义工作流程2.5 版本控制和协…

单元格法近似求解多边形最大内接矩形问题【思路讲解+java实现】

文章目录 问题描述问题解决方案多边形网格化区分每个单元格是在多边形内部还是外部根据已标记单元格寻找最大内接矩形剪枝优化多角度旋转 案例测试代码实现说明 问题描述 给定一个多边形的点集&#xff0c;希望找出多边形内部面积最大的矩形。该问题可能出现在&#xff0c;从一…

Linux命令200例:cu是用于设置与终端设备通信的工具

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

Netsh命令修复DNS无法上网问题

关注【潇湘信安】、【Hack分享吧】公众号&#xff0c;一起学网络安全知识&#xff01; 0x01 问题描述 今早打开电脑后突然发现上不了网了&#xff0c;TIM可以正常登录&#xff0c;浏览器打不开网页&#xff0c;出现这样情况一般都是DNS的问题&#xff0c;用ipconfig /all命令查…

Kotlin文件遍历FileTreeWalk filter

Kotlin文件遍历FileTreeWalk filter import java.io.Filefun main(args: Array<String>) {val filePath "."val file File(filePath)val fileTree: FileTreeWalk file.walk()fileTree//.maxDepth(1) //遍历层级1&#xff0c;不检查子目录.filter {it.isFile…

【Java 基础篇】深入理解Java集合嵌套:构建和管理复杂数据结构的终极指南

当我们谈论集合嵌套时&#xff0c;我们指的是在一个集合中存储另一个集合&#xff0c;或者说集合中的元素本身也是集合。这是一个非常有用的概念&#xff0c;可以在处理复杂数据结构时提供更灵活的选项。在本文中&#xff0c;我们将深入探讨Java中集合嵌套的概念、用法以及一些…

Jenkins 编译 Maven 项目提示错误 version 17

在最近使用集成工具的时候&#xff0c;对项目进行编译提示下面的错误信息&#xff1a; maven-compiler-plugin:3.11.0:compile (default-compile) on project mq-service: Fatal error compiling: error: release version 17 not supported 问题和解决 上面提示的错误信息原…

Llama.cpp工具main使用手册

Llama.cpp提供的 main工具允许你以简单有效的方式使用各种 LLaMA 语言模型。 它专门设计用于与 llama.cpp 项目配合使用。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 Llama.cpp的工具 main提供简单的 C/C 实现&#xff0c;具有可选的 4 位量化支持&#xff0c;可实现…