it-swarm.com.ru

Генерация случайной логической вероятности

Я только знаю, как я могу генерировать случайное логическое значение (true/false) . Вероятность по умолчанию составляет 50:50

Но как я могу сгенерировать истинное ложное значение с моей собственной вероятностью? Допустим, оно возвращает истину с вероятностью 40:60 или 20:80 и т.д. ...

24
Dark Side

Ну, одним из способов является Random.Next(100) <= 20 ? true : false, использующий целочисленное значение NextInt для определения вашей собственной вероятности. Я не могу говорить об истинной «случайности» этого метода.

Более подробный пример:

Random gen = new Random();
int prob = gen.Next(100);
return prob <= 20;
38
E. Moffat

Вы генерируете случайное число до 100 эксклюзивов и смотрите, меньше ли оно заданного процента. Пример:

if(random.Next(100) < 40) {
  // will be true 40% of the time
}

В более общем смысле, для вероятности X/Y, используйте такую ​​фразу:

if(random.Next(Y) < X)
17
Peter O.

Вот метод расширения, который предоставит случайному булу с заданной вероятностью (в процентах) быть истинным;

public static bool NextBool(this Random r, int truePercentage = 50)
{
    return r.NextDouble() < truePercentage / 100.0;
}

вы можете использовать это как 

Random r = new Random();
r.NextBool(); // returns true or false with equal probability
r.NextBool(20); // 20% chance to be true;
r.NextBool(100); // always return true
r.NextBool(0); // always return false
9
Hamid Pourjam

Предполагая, что ваша вероятность представлена ​​в виде double между 0,0 и 1,0, я бы реализовал ее более просто так:

Random Rand = new Random();
...
double trueProbability = 0.2;
bool result = Rand.NextDouble() < trueProbability;

result будет true с вероятностью, указанной trueProbability

http://msdn.Microsoft.com/en-us/library/system.random.nextdouble(v=vs.110).aspx

Если это не такдостаточно случайно", вы можете взглянуть на RNGCryptoServiceProvider:

http://msdn.Microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx

7
Mike

Я думаю, что это может помочь вам 

Random gen = new Random();
bool result = gen.Next(100) < 50 ? true : false;
2
Ivan Suen

Для будущих знаний:

40:60 будет:

var random = new Random();
return random.Next(10) < 4;

20:80 будет:

var random = new Random();
return random.Next(5) == 0

и 1: 1 будет:

var random = new Random();
return random.Next(2) == 1;

Примечание: просто сократите вероятность до самого короткого варианта - как, например, «random.Next (5) == 0» быстрее, чем «random.Next (100) <= 20 Хотя - если вероятность изменяется от пользовательский ввод - тогда это будет выглядеть так:

[ModifierByChoice] bool GetProbability(int trueProbability, int falseProbability)
{
var random = new Random();
return random.Next(trueProbability, trueProbability + falseProbability) < trueProbability;
}
0
AssassinLV