实施"百分比机会"在C#中

时间:2016-06-16 11:58:24

标签: c# asp.net random

我需要一些帮助以及C#代码的百分比机会。让我们说我有从1到100的循环,在那个循环中我有一个" if"我希望执行70%的代码(随机)。我怎么做到这一点?所以像这样:

static void Main(string[] args)
{
    var clickPercentage = 70;

    for (int i = 0; i < 100; i++)
    {
        if (chance)
        {
            //do 70% times
        }
    }
}

因此,对于顶级示例,我希望如果代码被击中的可能性为70%,对于我的示例约为70次。

我尝试过的事情:(远不及70%,更像是1%或2%的几率)

static void Main(string[] args)
{
    var clickPercentage = 70;

    for (int i = 0; i < 100; i++)
    {
        var a = GetRadnomNumber(1, clickPercentage);
        var b = GetRadnomNumber(1, 101);

        if (a <= b)
        {
            Console.WriteLine($"Iteracija {i} - {b} <= {a}");
        }
    }
}

public static int GetRadnomNumber(int min, int max)
{
    var random = new Random();
    var retVal = random.Next(min, max);

    return retVal;
}

4 个答案:

答案 0 :(得分:8)

使用Random class

您可以使用Random.Next(100)获取0到99之间的随机int

public static Random RandomGen = new Random();
.....

int clickPercentage = 70;
for (int i = 0; i < 100; i++)
{
    int randomValueBetween0And99 = RandomGen.Next(100);
    if (randomValueBetween0And99 < clickPercentage)
    {
        //do 70% times
    }
}

重要的是不要在循环中创建随机实例,因为它的默认构造函数使用当前时间作为种子。这可能会导致循环中的重复值。这就是我使用static字段的原因。您还可以将Random实例传递给方法,以确保调用者负责生命周期和种子。有时使用相同的种子很重要,例如重复相同的测试。

答案 1 :(得分:2)

对您的逻辑不太确定,但是从快速浏览一下就可以在循环中创建一个随机对象。

这个问题是Random类使用当前时间作为种子。如果种子相同,Random类将产生相同的随机数序列。由于这些天的CPU非常快,通常会发生几次循环迭代将具有完全相同的种子,因此,随机数生成器的输出将是完全可预测的(并且与之前的相同)。

为了避免这种情况,只需创建一次Random类的实例并在代码中重复使用它,例如

private static readonly Random _rnd = new Random();
// use _rnd in you code and don't create any other new Random() instances

答案 2 :(得分:2)

将其作为一种功能包装:

<div>
  <%= label :access_rights, "Read Only", value: false %>
  <%= f.radio_button :access_rights, false, :checked => true, :value => false %>
</div>

<div>
  <%= label :access_rights, "Read and Write", value: true %>
  <%= f.radio_button :access_rights, true, :value => true%>
</div>

并使用它:

private static Random generator = null; 

/*
 *  Calls onSuccess() chanceOfSuccess% of the time, otherwise calls onFailure() 
 */
public void SplitAtRandom(int chanceOfSuccess, Action onSuccess, Action onFailure)
{
    // Seed
    if (generator == null)
        generator = new Random(DateTime.Now.Millisecond);

    // By chance
    if (generator.Next(100) < chanceOfSuccess)
    {
        if (onSuccess != null)
            onSuccess();
    }
    else
    {
        if (onFailure != null)
            onFailure();
    }
}

答案 3 :(得分:0)

基本上,每次迭代都不需要新的Random - 实例。简单地使用这个:

var r = new Random();

for(int i = 0; i < 100; i++)
{
    var p = r.Next(100);
    if (p >= 1 - myThreshhold) // do anything in 70% of cases
}

或者您也可以使用if (p <= myThreshold)