Взвешенная генерация случайных чисел в C#

Вы могли использовать API Reflection, чтобы циклично выполниться через каждое из полей Car и присвоить значение эквивалентным полям Truck. Это может быть сделано в грузовике. Далее это - единственный способ получить доступ к частным полям Автомобиля - по крайней мере, в автоматическом смысле, если это менеджер безопасности не существует и доступ ограничения к частному полю.

7
задан Bill the Lizard 18 September 2012 в 17:01
поделиться

8 ответов

Random.NextDouble возвращает число от 0 до 1, поэтому должно работать следующее:

if (random.NextDouble() < 0.90)
{
    BlinkGreen();
}
else
{
    BlinkRed();
}
33
ответ дан 6 December 2019 в 04:51
поделиться

Либо

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) .

7
ответ дан 6 December 2019 в 04:51
поделиться
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
}
3
ответ дан 6 December 2019 в 04:51
поделиться

Другие ответы определенно подойдут, если вам понадобится случайное распределение, которое отдает предпочтение 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
ответ дан 6 December 2019 в 04:51
поделиться

Основываясь на ответе Майклза, но добавляя дополнительный контекст из вопроса:

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);
    }
}
1
ответ дан 6 December 2019 в 04:51
поделиться

Я предполагаю, что у вас отключена часть времени (так что этот код не решает эту проблему). Предполагая "хорошее" деление, это даст 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();
    }
}
1
ответ дан 6 December 2019 в 04:51
поделиться
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.

0
ответ дан 6 December 2019 в 04:51
поделиться

If you want these just to look random, you might want to implement shuffle bag

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

and

Need for predictable random generator

This way the blinking period should look more natural and you can simply implement the restricted number of blinks.

0
ответ дан 6 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: