C# 获取特定随机数
我想生成一个介于(1到6)之间的随机数,有没有办法改变得到数字6的几率大于其他数字 例如,对于此代码C# 获取特定随机数,c#,random,numbers,C#,Random,Numbers,我想生成一个介于(1到6)之间的随机数,有没有办法改变得到数字6的几率大于其他数字 例如,对于此代码 private void pictureBox5_MouseClick(object sender, MouseEventArgs e) { Random u = new Random(); m = u.Next(1,6); label2.Text = m.ToString(); } 这取决于可能性有多大。一个简单的方法(
private void pictureBox5_MouseClick(object sender, MouseEventArgs e)
{
Random u = new Random();
m = u.Next(1,6);
label2.Text = m.ToString();
}
这取决于可能性有多大。一个简单的方法(但不是很灵活)是:
private void pictureBox5_MouseClick(object sender, MouseEventArgs e)
{
Random u = new Random();
m = u.Next(1,7);
if (m > 6) m = 6;
label2.Text = m.ToString();
}
这取决于可能性有多大。一个简单的方法(但不是很灵活)是:
private void pictureBox5_MouseClick(object sender, MouseEventArgs e)
{
Random u = new Random();
m = u.Next(1,7);
if (m > 6) m = 6;
label2.Text = m.ToString();
}
那不是随机的。如果你想称量它的重量,这样你就有一半的时间得到6,你可以这样做:
m = u.Next(1,2);
if(m == 2)
{
label2.Text = "6";
}
else
{
label2.Text = u.Next(1,5).ToString();
}
根据你想要的权重,你可以改变它->3而不是2,得到33.33%的权重,以此类推。否则,正如评论者所说,你必须研究概率分布,寻找一个数学上更优雅的解决方案。那就不是随机的了。如果你想称量它的重量,这样你就有一半的时间得到6,你可以这样做:
m = u.Next(1,2);
if(m == 2)
{
label2.Text = "6";
}
else
{
label2.Text = u.Next(1,5).ToString();
}
根据你想要的权重,你可以改变它->3而不是2,得到33.33%的权重,以此类推。否则,正如评论者所说,你必须研究概率分布,以获得一个更精确的数学解。让
p
是任何1..5
数字的概率,1-p
是6
的概率:
//DONE: do not recreate Random
private static Random s_Generator = new Random();
private void pictureBox5_MouseClick(object sender, MouseEventArgs e) {
const double p = 0.1; // each 1..5 has 0.1 probability, 6 - 0.5
// we have ranges [0..p); [p..2p); [2p..3p); [3p..4p); [4p..5p); [5p..1)
// all numbers 1..5 are equal, but the last one (6)
int value = (int) (s_Generator.NexDouble() / p) + 1;
if (value > 6)
value = 6;
label2.Text = value.ToString();
}
设
p
为任何1..5
数字的概率,1-p
为6
的概率:
//DONE: do not recreate Random
private static Random s_Generator = new Random();
private void pictureBox5_MouseClick(object sender, MouseEventArgs e) {
const double p = 0.1; // each 1..5 has 0.1 probability, 6 - 0.5
// we have ranges [0..p); [p..2p); [2p..3p); [3p..4p); [4p..5p); [5p..1)
// all numbers 1..5 are equal, but the last one (6)
int value = (int) (s_Generator.NexDouble() / p) + 1;
if (value > 6)
value = 6;
label2.Text = value.ToString();
}
如果你想要一个完全随机分布的1…5和一个skwed 6,那么Dmitry的似乎是最好的 如果您想知道如何扭曲所有数字,请尝试以下方法:
- 创建一个100个元素的数组
- 根据你希望数字出现的频率,按比例填入数字1-6。(如果你想让6占1/3的时间,就把其中的33个数字设为6。4个4意味着25卷中只会出现一个,等等。每个数字中的15或16个将使其大致均匀分布,因此从那里调整计数)
- 然后从0…99中选择一个数字,并使用数组元素中的值
- 创建一个100个元素的数组
- 根据你希望数字出现的频率,按比例填入数字1-6。(如果你想让6占1/3的时间,就把其中的33个数字设为6。4个4意味着25卷中只会出现一个,等等。每个数字中的15或16个将使其大致均匀分布,因此从那里调整计数)
- 然后从0…99中选择一个数字,并使用数组元素中的值
/*static if applicable*/
int[] p = { (int)Math.Ceiling((double)100/6), (int)Math.Floor((double)100/6), (int)Math.Ceiling((double)100/6), (int)Math.Floor((double)100/6), (int)Math.Ceiling((double)100/6), (int)Math.Ceiling((double)100/6) };
////The array of probabilities for 1 through p.Length
Random rnd = new Random();
////The random number generator
int nextPercentIndex = rnd.Next() % 100; //I can't remember if it's length or count for arrays off the top of my head
////Convert the random number into a number between 0 and 100
int TempPercent = 0;
////A temporary container for comparisons between the percents
int returnVal = 0;
////The final value
for(int i = 0; i!= p.Length; i++){
TempPercent += p[i];
////Add the new percent to the temporary percent counter
if(nextPercentIndex <= TempPercent){
returnVal = i + 1;
////And... Here is your value
break;
}
}
/*静态(如适用)*/
数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学地板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6)};
////1到p.长度的概率数组
随机rnd=新随机();
////随机数发生器
int-nextPercentIndex=rnd.Next()%100//我记不起来是长度还是我头顶上的阵列数
////将随机数转换为0到100之间的数字
int TempPercent=0;
////用于比较百分比的临时容器
int returnVal=0;
////终值
for(int i=0;i!=p.Length;i++){
温度百分比+=p[i];
////将新百分比添加到临时百分比计数器
如果(nextPercentIndex,您可以通过获取数组中每个数字的百分比来定义可能性:
/*static if applicable*/
int[] p = { (int)Math.Ceiling((double)100/6), (int)Math.Floor((double)100/6), (int)Math.Ceiling((double)100/6), (int)Math.Floor((double)100/6), (int)Math.Ceiling((double)100/6), (int)Math.Ceiling((double)100/6) };
////The array of probabilities for 1 through p.Length
Random rnd = new Random();
////The random number generator
int nextPercentIndex = rnd.Next() % 100; //I can't remember if it's length or count for arrays off the top of my head
////Convert the random number into a number between 0 and 100
int TempPercent = 0;
////A temporary container for comparisons between the percents
int returnVal = 0;
////The final value
for(int i = 0; i!= p.Length; i++){
TempPercent += p[i];
////Add the new percent to the temporary percent counter
if(nextPercentIndex <= TempPercent){
returnVal = i + 1;
////And... Here is your value
break;
}
}
/*静态(如适用)*/
数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学地板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6)};
////1到p.长度的概率数组
随机rnd=新随机();
////随机数发生器
int-nextPercentIndex=rnd.Next()%100;//我记不起它是长度还是数组的计数
////将随机数转换为0到100之间的数字
int TempPercent=0;
////用于比较百分比的临时容器
int returnVal=0;
////终值
for(int i=0;i!=p.Length;i++){
温度百分比+=p[i];
////将新百分比添加到临时百分比计数器
如果(nextPercentIndex)您应该查看搜索词:加权随机您应该查看搜索词:加权随机