获取相同概率随机数的算法
2014-01-21 13:17
411 查看
各位,引用请指明出处,尊重劳动成果!!!
这几天在做公司年会的一个抽奖软件,开始做的的时候,认为算法是很简单的,把员工的数据放进list里,把list的标号作为需要获取的随机数,根据得到的随机数就确定是谁中奖。后来测试发现,随机数的分布是非常不均匀的。后来才知道,原来计算机获取的随机数都是伪随机数,当抽奖的速度非常快的时候,获取的随机数是非常不均匀的,所以在每次抽奖的时候要添加延时。后来重新设计算法,最终实现了。
算法原理跟二分查找的过程有点像。一枚硬币抽中正、反面的概率是一样,当抽样的次数无限增多,抽中的概率是50%。
代码如下:
以上算法不是非常好,取消延时,将random对象设置为全局变量。修改版代码如下:
这几天在做公司年会的一个抽奖软件,开始做的的时候,认为算法是很简单的,把员工的数据放进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; //} } } }
相关文章推荐
- c#获取相同概率随机数的算法代码
- c#获取相同概率随机数
- 一天一道算法题—2015-10-22(等概率的随机数)
- 微信红包算法获取若干随机数总和为固定值
- js 生成概率相同的1-4 随机数
- [算法][随机数]一种生成2个不相同的随机数的方法
- 黑马程序员-JAVA基础面试-获取10个1-20 的随机数,要求获取的随机数不能相同!
- ListCtrl获取首列值相同的插入算法
- 生成互不相同随机数的一种算法
- 关于数值概率算法及随机数
- 随机数算法----根据概率取随机数
- 随机数算法----根据概率取随机数
- java 利用二进制位进行标记,获取不相同的随机数
- 谈谈等概率不重复随机数生成算法中的大学问
- 生成互不相同随机数的一种算法
- c语言实现的两种获取随机数的算法
- 等概率获取随机数
- C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等)
- SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等) C# MD5 加密,解密 C#中DataTable删除多条数据
- C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等)