C#中的加权随机数生成

如何随机生成两种状态中的一种,10%的时间内产生“红色”概率,90%的时间产生“绿色”?

背景

每2秒钟,绿灯或红灯都会闪烁。

该序列将持续5分钟。

闪烁灯的总发生次数应为300。

Random.NextDouble返回0到1之间的数字,因此以下内容应该有效:

if (random.NextDouble() < 0.90) { BlinkGreen(); } else { BlinkRed(); } 

 Random rg = new Random(); int n = rg.Next(10); if(n == 0) { // blink red } else { // blink green } 

要么

 Random rg = new Random(); double value = rg.NextDouble(); if(value < 0.1) { // blink red } else { // blink green } 

这是有效的,因为Random.Next(int maxValue)[0, maxValue) Random.Next(int maxValue)返回一个均匀分布的整数,而Random.NextDouble[0, 1)返回一个均匀分布的double

 public class NewRandom { private static Random _rnd = new Random(); public static bool PercentChance(int percent) { double d = (double)percent / 100.0; return (_rnd.NextDouble() <= d); } } 

使用:

 if (NewRandom.PercentChance(10)) { // blink red } else { // blink green } 

如果您需要一个有利于90%绿色的随机分布,其他答案肯定会有效

但是,如果您需要精确分布,这样的东西将起作用:

 void Main() { Light[] lights = new Light[300]; int i=0; Random rand = new Random(); while(i<270) { int tryIndex = rand.Next(300); if(lights[tryIndex] == Light.NotSet) { lights[tryIndex] = Light.Green; i++; } } for(i=0;i<300;i++) { if(lights[i] == Light.NotSet) { lights[i] = Light.Red; } } //iterate over lights and do what you will } enum Light { NotSet, Green, Red } 

以迈克尔斯为基础回答,但从问题中添加了更多背景:

 public static void PerformBlinks() { var random = new Random(); for (int i = 0; i < 300; i++) { if (random.Next(10) == 0) { BlinkGreen(); } else { BlinkRed(); } // Pause the thread for 2 seconds. Thread.Sleep(2000); } } 

我猜你有时间部分(所以这段代码没有解决)。 假设“好”分裂,这将产生10%的红色和90%的绿色。 如果准确性不重要,迈克尔的回答已经得到了我的投票。

 static void Main(string[] args) { int blinkCount = 300, redPercent = 10, greenPercent = 90; List blinks = new List(300); for (int i = 0; i < (blinkCount * redPercent / 100); i++) { blinks.Add(new BlinkObject("red")); } for (int i = 0; i < (blinkCount * greenPercent / 100); i++) { blinks.Add(new BlinkObject("green")); } blinks.Sort(); foreach (BlinkObject b in blinks) { Console.WriteLine(b); } } class BlinkObject : IComparable { object Color { get; set; } Guid Order { get; set; } public BlinkObject(object color) { Color = color; Order = Guid.NewGuid(); } public int CompareTo(BlinkObject obj) { return Order.CompareTo(obj.Order); } public override string ToString() { return Color.ToString(); } } 
 var random = new Random(); for (var i = 0; i < 150; ++i) { var red = random.Next(10) == 0; if (red) // .. else // Green } 

random.Next(10)将随机返回数字0..9,并且有10%的几率返回0。

如果你想让它们看起来随意,你可能想要实现shuffle bag

http://web.archive.org/web/20111203113141/http://kaioa.com:80/node/53

需要可预测的随机发生器

这样,闪烁周期应该看起来更自然,您可以简单地实现有限数量的闪烁。