以某种可能性从数组中添加随机值

时间:2015-05-27 13:24:57

标签: c# arrays probability

假设我有一个Windows窗体的代码,当您按下按钮时会生成问候语。

   string[] Greetings = new string[] { "Hi", "Hello", "Howdy!", "Hey" };
   string[] Smilies = new string[] {";)", ":)", "=)", ":-)" };

   Random rand = new Random();
   string Greet = Greetings[rand.Next(0, Greetings.Length)];
   string Smile = Smilies[rand.Next(0, Smilies.Length)];
   TextBox.Text = Greet + " " + Smile;
   Clipboard.SetText(TextBox.Text);

如果我想添加概率为X%的表情符号,该怎么办?所以它们不会一直出现,但我有机会在代码中设置?有什么好办法吗?

我想到了这样的事情 -

    public void chance (string source, int probability)
    {
        Random chanceStorage = new Random();
        if (probability >= chanceStorage.Next(0, 100))
            TextBox.Text = source;
    }

然后

    TextBox.Text = Greet;
    chance("_" + Smile, X);

这是最佳的吗?

3 个答案:

答案 0 :(得分:2)

有50%的机会微笑:

   string[] Greetings = new string[] { "Hi", "Hello", "Howdy!", "Hey" };
   string[] Smilies = new string[] {";)", ":)", "=)", ":-)" };

   Random rand = new Random();
   string Greet = Greetings[rand.Next(0, Greetings.Length)];
   string Smile = rand.NextDouble() > 0.5 ? " "+Smilies[rand.Next(0, Smilies.Length)] : string.Empty;
   TextBox.Text = Greet + Smile;

答案 1 :(得分:0)

我只是生成一个0,1(包括0)和random.NextDouble()之间的随机双精度。然后你可以检查概率(作为0到1之间的值)是否小于生成的数字。

例如

double chance = 0.35; //35%
bool createSmiley = rand.NextDouble() < chance;

这不一定完全精确(因为浮点数的精度有限)但会让你非常接近。并且允许比仅使用ints作为随机数更精确。

A demo of the random generation of smileys

另一方面,我会重构你的代码以更好地隔离逻辑。我个人只是尝试操作单个字符串,并在完成所有字符串处理后设置.Text属性。

答案 2 :(得分:0)

我会根据您的概率划分您的Smilies数组的长度,以生成一系列随机数。

4个表情符号/ 25%概率= 16.所以你的随机发生器会产生一个0到15的随机数,有25%的几率使用笑脸。如果生成的数字超出了数组的范围,请不要使用笑脸。

using System;

public class Program
{
    public static void Main()
    {
        Random rand = new Random();
        double percentage = rand.NextDouble();

        string[] greetings = new[] { "Hi", "Hello", "Howdy!", "Hey" };
        string[] smilies = new[] { ";)", ":)", "=)", ":-)" };

        // Get a greeting
        string greet = greetings[rand.Next(0, greetings.Length)];

        // Generate the smiley index using the probablity percentage
        int randomIndex = rand.Next(0, (int)(smilies.Length / percentage));

        // Get a smiley if the generated index is within the bound of the smilies array
        string smile = randomIndex < smilies.Length ? smilies[randomIndex] : String.Empty;

        Console.WriteLine("{0} {1}", greet, smile);
    }
}

请参阅此处的工作示例... https://dotnetfiddle.net/lmN5aP