如何随机生成两种状态中的一种,在10%的时间内生成“红色”概率,90%的时间生成“绿色”?
每2秒钟,绿灯或红灯都会闪烁。
此序列将持续5分钟。
闪烁灯的总发生次数应为300次。
答案 0 :(得分:33)
Random.NextDouble返回0到1之间的数字,因此以下内容应该有效:
if (random.NextDouble() < 0.90)
{
BlinkGreen();
}
else
{
BlinkRed();
}
答案 1 :(得分:7)
无论
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.NextDouble
会在double
中返回一个均匀分布的[0, 1)
。
答案 2 :(得分:3)
如果您需要支持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
}
答案 3 :(得分:3)
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
}
答案 4 :(得分:1)
以Michaels为基础回答,但从问题中添加了更多背景信息:
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);
}
}
答案 5 :(得分:1)
我猜你有时间部分(因此这段代码没有解决这个问题)。假设“好”分裂,这将产生10%的红色和90%的绿色。如果准确性不重要,迈克尔的回答已经得到了我的投票。
static void Main(string[] args)
{
int blinkCount = 300, redPercent = 10, greenPercent = 90;
List<BlinkObject> blinks = new List<BlinkObject>(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<BlinkObject>
{
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();
}
}
答案 6 :(得分:0)
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。
答案 7 :(得分:0)
如果你想让它们看起来随机,你可能想要实现随机包
http://web.archive.org/web/20111203113141/http://kaioa.com:80/node/53
和
Need for predictable random generator
这样,闪烁周期应该看起来更自然,你可以简单地实现有限数量的闪烁。