当前位置: 首页 > news >正文

(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显示。(不能全部排序,红蓝是两部分)
    
  

相关文章:

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

一、需求 1.双色球: 投注号码由6个红色球号码和1个蓝色球号码组成。 2.红色球号码从01--33中选择,红色球不能重复。 3.蓝色球号码从01--16中选择。 4.最终结果7个号码&#xff1a;61&#xff1b;即33选6(红) 16选1(蓝) 5.产品: …...

升级OpenSSL并进行编译安装

Packaging (OpenSSL)组件存在安全漏洞的原因是由于当前爆出的Openssl漏洞。 这个漏洞可能会导致泄露隐私信息&#xff0c;并且涉及的机器和环境也有所不同&#xff0c;因此修复方案也会有所不同。 目前&#xff0c;一些服务器使用的Nginx是静态编译OpenSSL&#xff0c;直接将Op…...

Spring整合RabbitMQ

一、步骤 生产者 ① 创建生产者工程 ② 添加依赖 ③ 配置整合 ④ 编写代码发送消息 消费者 ① 创建消费者工程 ② 添加依赖 ③ 配置整合 ④ 编写消息监听器 二、代码 生产者工程 1.在生产者工程和消费者工程中都导入如下依赖 <dependencies><dependency&g…...

MySQL——事务和视图

2023.9.17 本章开始介绍TCL语言&#xff08;Transaction Control Language 事务控制语言&#xff09;。 事务 事务的概念&#xff1a;一个或一组sql语句组成一个执行单元&#xff0c;这个执行单元要么全部执行&#xff0c;要么全部不执行。 事务的特性&#xff1a;&#xff…...

做好制造项目管理的5个技巧

制造过程通常由不同的要素组成&#xff0c;如采购材料、与供应商合作、优化生产线效率等。制造商还需要处理库存、物流和分销。 为了确保制造项目在预算范围内按时完成&#xff0c;并且不遗漏任何环节&#xff0c;企业必须建立项目管理流程&#xff0c;以帮助改善组织流程和效…...

JavaScript中While循环

JavaScript中处理For循环&#xff0c;还有一种循环while循环&#xff1b; ● 例如我们之前写了一个模拟举重次数的For循环&#xff0c;如下所示 for (let rep 1; rep < 10; rep) {console.log(举重${rep}次); }● 我们也可以使用while循环去实现这种功能 let rep 1; whi…...

python经典百题之乒乓球比赛

题目&#xff1a; 两个乒乓球队进行比赛&#xff0c;各出三人。甲队为a,b,c三人&#xff0c;乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比&#xff0c;c说他不和x,z比&#xff0c;请编程序找出三队赛手的名单。第一种方式&#xff1a; 思路…...

【C++ Exceptions】Catch exceptions by reference!

catch exceptions 写一个catch子句时必须指明异常对象是如何传递到这个子句来的&#xff0c;三种方式&#xff1a; by pointerby valueby reference 接下来比较它们使用时会出现的问题&#xff0c;以说明最好的选择是by reference。 catch by pointer 无需复制对象&#x…...

高斯公式证明

高斯公式&#xff1a; 若空间闭区域 Ω \Omega Ω 由光滑的闭曲面 Σ \Sigma Σ 围成&#xff0c;则 ∫ ∫ ∫ Ω ( ∂ P ∂ x ∂ Q ∂ y ∂ R ∂ z ) d v ∮ ∮ Σ P d y d z Q d z d x R d x d y \int \int \int _{\Omega}(\frac{\partial P}{\partial x} \frac{\p…...

速卖通获得aliexpress商品详情 API 返回值说明

item_get-获得aliexpress商品详情 aliexpress.item_get 进入测试 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search…...

c++语法-模板

模板 模板是C中一种强大的特性&#xff0c;允许你编写通用的代码&#xff0c;以便在不同数据类型上重复使用。模板分为函数模板和类模板&#xff0c;它们都是在编译时生成具体代码的蓝图。 函数模板 函数模板是一种定义通用函数的方式&#xff0c;可以在不同数据类型上使用相…...

DMNet复现(一)之数据准备篇:Density map guided object detection in aerial image

一、生成密度图 密度图标签生成 采用以下代码&#xff0c;生成训练集密度图gt&#xff1a; import cv2 import glob import h5py import scipy import pickle import numpy as np from PIL import Image from itertools import islice from tqdm import tqdm from matplotli…...

k8s相关命令-命名空间

k8s相关命令目录 文章目录 前言一、创建命名空间二、删除命名空间三、查看命名空间列表四、查看命名空间列表五、查看特定命名空间下所有资源六、删除特定命名空间下所有资源 前言 记录k8s命名空间的相关操作命令 一、创建命名空间 kubectl create namespace <namespace&g…...

CG Magic分享同一场景里下,VR渲染器和CR渲染器哪个好?

渲染操作时&#xff0c;VR渲染器和CR渲染器的对比成为常见问题了。这个问题很多人都会问。 今天CG Magic小编通过一个真实的项目&#xff0c;就是同一场景下来比较一下VR渲染器和CR渲染器的区别。 以下图为例是用来测试的场景当年的最终图。采用了当年的一个伊丽莎白大街152号的…...

Hive工作原理

Hive 工作原理详解-阿里云开发者社区 Hive的服务端组件 1. Driver组件&#xff1a;该组件包括&#xff1a;Compiler、Optimizer、Executor,它可以将Hive的编译、解析、优化转化为MapReduce任务提交给Hadoop1中的JobTracker或者是Hadoop2中的SourceManager来进行实际的执行相应…...

vue 使用this.$set设置对象属性值时,不更新试图

vue 使用this.$set设置对象属性值时&#xff0c;不更新试图。 后来发现是因为若对象中存在该属性时&#xff0c;只更新值&#xff0c;不添加响应监测。 //vue/src/core/observer/index.js 源码片段/*** Set a property on an object. Adds the new property and* triggers ch…...

uniapp视频播放功能

UniApp提供了多种视频播放组件&#xff0c;包括视频播放器&#xff08;video&#xff09;、多媒体组件&#xff08;media&#xff09;、WebView&#xff08;内置Video标签&#xff09;等。其中&#xff0c;video和media组件是最常用的。 video组件 video组件是基于HTML5 vide…...

Java面向对象七大原则以及设计模式单例模式和工厂模式简单工厂模式

面向对象的七大原则&#xff08;OOP&#xff09; 1,开闭原则&#xff1a; 对扩展开发&#xff0c;对修改关闭 2.里氏替换原则&#xff1a; 继承必须确保超类所拥有的子类的性质在子类中仍然成立 3.依赖倒置原则&#xff1a; 面向接口编程&#xff0c;不要面向实现编程&am…...

Linux 遍历目录(cd 命令)

Linux 遍历目录&#xff08;cd 命令&#xff09; 文章目录 Linux 遍历目录&#xff08;cd 命令&#xff09;一、cd 命令二、绝对文件路径三、相对文件路径 一、cd 命令 在 Linux 文件系统上&#xff0c;可以使用 cd 命令将 shell 会话切换到另一个目录。cd 命令的格式也很简单…...

整合Nginx实现反向代理

针对后端启动多个服务&#xff0c;接口需要统一请求路径时&#xff0c;可以使用nginx进行请求地址反向代理。 1.下载: nginx 2.下载完成后解压&#xff0c;找到配置文件nginx.conf&#xff08;在解压文件的conf目录中&#xff09;&#xff0c;在http中增加以下示例代码&#x…...

如果写好AI提示词:这份 Prompt 调试速查表帮你事半功倍

有句话说得好&#xff1a;"好的工程师和差的工程师的区别&#xff0c;不在于他们多聪明&#xff0c;而在于他们有没有一份好的排障清单。"这句话对 Prompt 工程也完全适用。最近三个月&#xff0c;我在 Claude 社区的 Discord 里帮人调试 Prompt。最常见的情况是什么…...

STM32的DAC玩出花:双通道独立波形生成与相位差控制的保姆级配置指南

STM32双通道DAC相位控制实战&#xff1a;从定时器触发到波形同步的工程实现 在工业控制、音频合成和通信系统仿真等领域&#xff0c;精确控制两路模拟信号之间的相位关系是常见需求。STM32系列微控制器内置的12位DAC配合定时器与DMA&#xff0c;能够实现双通道独立波形生成与微…...

到极限了吗?优化算法APP9.0,再加入228个车间调度案例!

我又来更新啦&#xff01;这次在优化算法APP8.0的基础上再次大更新&#xff01;加入了4大经典车间调度数据集&#xff0c;共228个实例开箱即用。这个案例的加入非常适合写论文哦&#xff01;当你以为我黔驴技穷的时候&#xff0c;不好意思&#xff0c;我的表演才刚刚开始~ 哈哈…...

iOS 27 开放 AI 生态@ACP#专业视频处理新标杆 ——GSV9001E/S 赋能 iPhone AI 多屏智能显示

一、iOS 27 开放 AI&#xff1a;引爆专业视频处理与多屏显示刚需iOS 27 全面开放第三方 AI 模型&#xff0c;iPhone 成为 AI 内容生成、多源信号整合、智能交互核心&#xff0c;直接催生AI 多屏拼接、无缝切换、画中画、HDR/SDR 转换、车载 / 工控多视图、医疗 AI 显示六大专业…...

一本通题解——从递推公式到状态转移:破解“位数问题”中的数字计数

1. 从具体问题到通用模型&#xff1a;理解数字计数的本质 遇到"统计N位数中偶数个3的个数"这类问题时&#xff0c;很多初学者会陷入暴力枚举的思维陷阱。我刚开始刷题时也犯过这个错误——试图手动列出所有两位数来验证样例。这种方法的局限性在N1000时就会暴露无遗…...

别再傻傻分不清!舵机、步进、无刷、永磁同步,这四种电机到底怎么选?

电机选型实战指南&#xff1a;舵机、步进、无刷与永磁同步的黄金法则 在机器人关节调试现场&#xff0c;一位工程师盯着反复抖动的机械臂摇头&#xff1a;"早知道该用无刷电机..."&#xff1b;创客空间里&#xff0c;几个学生围着一台失控的3D打印机争论&#xff1a…...

CommandAI:用自然语言驱动命令行,AI赋能开发运维效率革命

1. 项目概述&#xff1a;当命令行遇上AI&#xff0c;效率革命的新起点 如果你和我一样&#xff0c;每天有超过一半的工作时间是在终端&#xff08;Terminal&#xff09;里度过的&#xff0c;那你一定对命令行&#xff08;Command Line&#xff09;又爱又恨。爱的是它的高效、精…...

RoboMaster视觉入门:用OpenCV3.4.5从摄像头图像里找出装甲板(附完整C++代码)

RoboMaster视觉实战&#xff1a;从零构建装甲板识别系统&#xff08;C/OpenCV3.4.5全解析&#xff09; 在RoboMaster机甲大师赛中&#xff0c;视觉识别系统如同战车的"眼睛"&#xff0c;而装甲板识别则是核心中的核心。本文将带你从零开始&#xff0c;用OpenCV3.4.5…...

SharpKeys:免费Windows键盘重映射终极解决方案

SharpKeys&#xff1a;免费Windows键盘重映射终极解决方案 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys SharpKey…...

Kubernetes部署Dify AI平台:从Docker Compose到K8s原生YAML完整迁移指南

1. 项目概述与核心价值最近在折腾AI应用开发平台&#xff0c;发现Dify这个工具确实挺有意思&#xff0c;它把大模型应用开发的门槛降得很低。不过&#xff0c;官方主要提供了Docker Compose的部署方式&#xff0c;对于已经将生产环境全面容器化、并且用上了Kubernetes的团队来说…...