c#获取相同概率随机数的算法代码
发布时间:2022-09-07 21:18:13
这几天在做公司年会的一个抽奖软件,开始做的的时候,认为算法是很简单的,把员工的数据放进list里,把list的标号作为需要获取的随机数,根据得到的随机数就确定是谁中奖。后来测试发现,随机数的分布是非常不均匀的。后来才知道,原来计算机获取的随机数都是伪随机数,当抽奖的速度非常快的时候,获取的随机数是非常不均匀的,所以在每次抽奖的时候要添加延时。后来重新设计算法,最终实现了。
算法原理跟二分查找的过程有点像。一枚硬币抽中正、反面的概率是一样,当抽样的次数无限增多,抽中的概率是50%。
代码如下:
public partial class MainWindow : Window
{
string s;
int number;
public MainWindow()
{
InitializeComponent();
}
public int getRandom()
{
//string[] arr = new string[5] { "我们", "是", "一", "个","团队" };
Random r = new Random();
int num = 2;
int choose = r.Next(num);
return choose;
//MessageBox.Show(arr[choose].ToString());
}
public string GRandom(int n)
{
//if()
if (n == 0)
{
//s = getRandom() + s;
//System.Threading.Thread.Sleep(1);
return s;
}
if (n % 2 == 0)
{
n = n / 2;
}
else
{
n = (n - 1) / 2;
//s = getRandom() + s;
}
s = getRandom() + s;
System.Threading.Thread.Sleep(20);
GRandom(n);
//System.Threading.Thread.Sleep(1);
return s;
}
public Int32 Estimate(int n)
{
string num = GRandom(n);
number = Convert.ToInt32(num, 2);
if (number > n - 1)
{
//num = "";
s = "";
Estimate(n);
}
//else
return number;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 100; i++)
{
label1.Content += Estimate(200) + ";";
s = "";
}
}
}
以上算法不是非常好,取消延时,将random对象设置为全局变量。修改版代码如下:
string s;
int number;
Random r = new Random();
public int getRandom()
{
//string[] arr = new string[5] { "我们", "是", "一", "个","团队" };
//Random r = new Random();
int num = 2;
int choose = r.Next(num);
return choose;
//MessageBox.Show(arr[choose].ToString());
}
public string GRandom(int n)
{
//if()
if (n == 0)
{
//s = getRandom() + s;
//System.Threading.Thread.Sleep(1);
return s;
}
if (n % 2 == 0)
{
n = n / 2;
}
else
{
n = (n - 1) / 2;
//s = getRandom() + s;
}
s = getRandom() + s;
GRandom(n);
return s;
}
public Int32 Estimate(int n)
{
string num = GRandom(n);
number = Convert.ToInt32(num, 2);
if (number > n - 1)
{
//num = "";
s = "";
Estimate(n);
}
//else
return number;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 1000; i++)
{
label1.Content = Estimate(200);
s = "";
}
//以下为测试
//int a = 0, b = 0, c = 0, d = 0, f = 0;
//for (int i = 0; i < 1000; i++)
//{
// //label1.Content = Estimate(2);
// int content = Estimate(5);
// s = "";
// switch (content)
// {
// case 0:
// a ++;
// break;
// case 1:
// b ++;
// break;
// case 2:
// c ++;
// break;
// case 3:
// d ++;
// break;
// case 4:
// f ++;
// break;
// }
// label1.Content = a;
// label2.Content = b;
// label3.Content = c;
// label4.Content = d;
// label5.Content = f;
//}
}
}
}


猜你喜欢
- 大家好,我是程序员田同学!今天上午收到一个需求,针对当前的系统开发一个对外开放的接口。既然是对外开放,那么调用者一定没有我们系统的Token
- 前言在介绍使用微信自定义分享前,我们来先了解一下什么是自定义分享?访问自定义微信外链地址页面,点击红色框位置进行分享给朋友或者朋友圈,具体操
- 本文实例为大家分享了C# picturebox实现图像拖拽和缩放的具体代码,供大家参考,具体内容如下1.核心步骤:①新建Point类型全局变
- 在网上有非常多通过射线方式实现的人物行走控制脚本,可是假设仅仅是想通过键盘按键来控制的话。比方进行第三人称视角控制,事实上仅仅须要进行简单的
- 目录IO简介1.流Stream 2.IO流的继承结构3 File文件类3.1概述3.2创建对象3.3常用方法 3.4 练
- 实现一个顺序表接口实现定义一个MyArrayList类,在类中实现以下函数public class MyArrayList {}数组的定义p
- 什么是Handler?Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联。每个H
- 数组作为函数的参数传递首地址。A进行修改,a同时也会进行修改。数组参数的传递机制来源:https://blog.csdn.net/weixi
- 因为课程需要,昨天好多同学在安装Android studio3.6.1后,无法构建,不知道什么原因,我的电脑上使用的是之前3.4版本的,可以
- 本文实例讲述了Java实现的双向匹配分词算法。分享给大家供大家参考,具体如下:目前比较流行的几大分词算法有:基于字符串匹配的分词方法、基于理
- 1. selectKey标签查询DDLCREATE TABLE `luck_reward_info` ( `id` int NO
- 前言最近在学习使用 React Native开发,iOS搞完,开始适配安卓,由于木有接触过安卓,所以碰到了很多问题,第一个问题,安卓的返回键
- 在android开发中我们常常遇到与到乱码问题,遇到乱码问题首先我们要先检查两端编码格式是否一致!一般我们提交数据用get 和post方法,
- 在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。解决的方法就是新开一个线程,把耗时的
- 获取Android的ROOT权限其实很简单,只要在Runtime下执行命令"su"就可以了。// 获取ROOT权限pub
- 1.如下图中的检测值存到数据库是科学计数法2 经过代码处理后3 只需要对你读到的字符串进行如下操作BigDecimal bd = new B
- 前言如何下载和使用MyBatis Generator 插件,只说代码,不讲感情。如果有问题还请多多指点。开发环境开发工具:IntelliJ
- 1、Date日期输出可读性较差Date date = new Date();System.out.println(date);打印输出的结果
- 本文实例为大家分享了C#二维码图片识别的具体代码,供大家参考,具体内容如下怎么用NuGet和怎么配置log4net就不介绍了,直接上代码(V
- 引言前一段有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技术栈都颇为好奇。智能可燃气体报警器