Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串数组,增加某个字符串被拾取的几率?_C#_Arrays - Fatal编程技术网

C# 字符串数组,增加某个字符串被拾取的几率?

C# 字符串数组,增加某个字符串被拾取的几率?,c#,arrays,C#,Arrays,我对这整件事还不太熟悉。我正在制作一个程序,它会提示用户输入一个名称,然后将这个名称存储在一个数组中(数组的大小是4),然后随机选择一个名称并显示它 我想知道如何增加某个名字被选中的机会,例如,我输入 上下快速移动 吉姆, 厕所, 提姆, 进入阵列后,Bob是否有可能增加被选中的机会?我不知道从哪里开始,甚至不知道该做什么,我到处都找了。很容易——作弊 不要选择一个数字(0-3),而是选择一个(0-4),如果你得到了4,就使用0。你还没有搜索到足够的数据,因为这非常简单,而且是一个众所周知的概率

我对这整件事还不太熟悉。我正在制作一个程序,它会提示用户输入一个名称,然后将这个名称存储在一个数组中(数组的大小是4),然后随机选择一个名称并显示它

我想知道如何增加某个名字被选中的机会,例如,我输入 上下快速移动 吉姆, 厕所, 提姆, 进入阵列后,Bob是否有可能增加被选中的机会?我不知道从哪里开始,甚至不知道该做什么,我到处都找了。

很容易——作弊


不要选择一个数字(0-3),而是选择一个(0-4),如果你得到了4,就使用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
i=0;
总和=0;
而(i=prob[i])
{
pick-=prob[i];
i++;
}
//我现在是所选名称的索引

此选项相当简单

  • 创建包含名称权重的简单类
  • 初始化所有名称及其权重的列表(由您定义权重的内容)
  • 对于每个名称,根据其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)];
}
公共类名称选项
{
公共字符串名称{get;set;}
公共整数权重{get;set;}
公共名称选项(字符串名称、整数权重)
{
名称=名称;
重量=重量;
}
}
//需要声明System.Linq命名空间才能使用Linq语句
公共字符串PickName()
{
var namepoptions=新列表
{
新名称选项(“Bob”,5),
新名称选项(“John”,1),
等
};
//仅供参考-如果权重为负值或0,以下操作将不起作用。
var namesToPickFrom=新字符串[nameOptions.Sum(x=>x.Weight)];
var-nameIndex=0;
foreach(名称选项中的变量选项)
{
对于(变量i=0;i
为每个名称存储一个将被拾取的百分比。确保百分比加起来等于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.

增加数组的大小,让Bob多次列出。到目前为止,您有什么发现?到目前为止,你是如何挑选它们的?当然这是可能的,但你必须定义是什么使得“鲍勃”更有可能被挑选。您使用的是加权分布吗?是否只是名称的一些特殊之处,列表中名称的多个实例?您还没有找到足够的需求。@BradleyDotNET在我看来,仅指定Bob被选中以获得解决方案的(更大)概率就足够了。我们真的不需要知道为什么,概率更高,是吗?@phoog然后我们得到了Jame的答案。。虽然这是真的,但并不真正令人兴奋,包括OPs对问题/方法的理解。这必须是有史以来最便宜的加权分布;)如果,甚至不需要
,只需对其进行模化即可。请尝试LINQPad或ideone快速测试编码。@user2864740谢谢。我想我找到了我最喜欢的新工具D