mysql 概率随机算法_c#获取相同概率随机数的算法与代码

要实现一个年会抽奖程序,算法:

把员工的数据放进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;

//}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值