asp.net 在C#中实现“百分比机会”

gijlo24d  于 12个月前  发布在  .NET
关注(0)|答案(5)|浏览(119)

我需要一些关于C#代码中的百分比机会的帮助。假设我有一个从1到100的for循环,在这个循环中我有一个“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;
}

50pmv0ei

50pmv0ei1#

使用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示例传递给方法,以确保调用者对生存期和种子负责。有时使用相同的例如,重复相同的测试。

j2datikz

j2datikz2#

把它作为一个函数:

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();
    }
}

字符串
并使用它:

for (int i = 0; i < 100; i++)
{
    SplitAtRandom(70, 
                  () => { /* 70% of the time */ }, 
                  () => { /* 30% of the time */ });
}

muk1a3rh

muk1a3rh3#

不太确定你的逻辑,但从快速浏览,你正在创建一个循环中的随机对象。
这样做的问题是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

字符串

m528fe3b

m528fe3b4#

基本上你不需要在每次迭代中都创建一个新的Random-instance。简单的使用这个:

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)

quhf5bfb

quhf5bfb5#

我最近也遇到了这个问题

int RF = 1;
int RV = 10;
float chance = (rand.Next(1, (RF + 1)) <= RV) ? 1 : 0;
Console.WriteLine(chance);

字符串
这是一个很小的决策,它需要概率字段和期望值,在这种情况下,你可以插入7和10,就会有7到10的机会

相关问题