字符串数组,增加某个字符串被选中的几率?

时间:2014-09-11 21:58:55

标签: c# arrays

我对这件事情都很陌生。我正在创建一个程序,提示用户输入一个名称,然后将该名称存储在一个数组中(数组大小为4),然后随机选择一个名称并显示它。

我想知道如何增加选择某个名字的机会,例如,我输入 鲍勃, 吉姆 约翰, 蒂姆 进入阵列,鲍勃有可能获得被选中的机会吗?我不确定从哪里开始或甚至做什么,我到处搜索过。

4 个答案:

答案 0 :(得分:1)

此选项相当简单。

  • 制作一个包含名称重量的简单类
  • 初始化所有名称及其重量的清单(由您来定义决定重量的因素)。
  • 对于每个名称,根据它的X权重将其添加到主阵列。
  • 随机获取介于0和数组上边界之间的索引。


public class NameOption
{
     public string Name { get; set; }
     public int Weight { get; set; }

     public NameOption(string name, int weight)
     {
         Name = name;
         Weight = weight;
     }
}

// Will need the System.Linq namespace declared in order to use the LINQ statements
public string PickName()
{
    var nameOptions = new List<NameOption> 
                {
                    new NameOption("Bob",5),
                    new NameOption("John", 1),
                    etc...
                };
    // FYI - following won't work if Weight was a negative value or 0.
    var namesToPickFrom = new string[nameOptions.Sum(x => x.Weight)];
    var nameIndex = 0;
    foreach (var option in nameOptions)
    {
       for (var i = 0; i < option.Weight; i++)
           namesToPickFrom[nameIndex++] = option.Name;
    }
    var random = new Random();
    return namesToPickFrom[random.Next(0, namesToPickFrom.Length-1)];
}

答案 1 :(得分:0)

容易---作弊。

不是选择一个数字(0-3),而是选择一个(0-4),如果得到4,则使用0。

答案 2 :(得分:0)

您还没有足够的搜索,因为这很容易,也是一个众所周知的概率问题。 为了保持尽可能简单,只需使用两个数组,一个带有名称,另一个带有正整数。

只要它们代表被选中的权重,整数具有什么值并不重要。这是概率的相对量度。

现在总结一下:

i = 0;
sum = 0;
while (i < prob.Length)
{
    sum += prob[i];
}

pick = rnd.Next(sum); // 0..sum-1

i = 0;
while (pick >= prob[i])
{
    pick -= prob[i];
    i++;
}

// i is now the index of the name picked

答案 3 :(得分:0)

对于每个名称存储,将选择一个百分比。确保百分比加起来为100。 根据百分比为每个名称指定范围。

伪示例:

Bob = 50%
Jim = 10%
John = 20%
Tim = 20%

//Have your code assign Ranges Based on the percentage:
Bob: Low=1, High=50
Jim: Low=51, High=60
John: Low=61, High=80
Tim: Low=81, High=100

//Get a random number between 1 and 100. Use if-elses to return the matching name.