使用百分比

时间:2018-04-20 16:00:45

标签: c# math logic

我有一个具有X数量爱好的对象,每个爱好的值介于0-100(表示%)之间,并且它们一起加起来为100.

每天早上我想运行一个决定该对象将要做什么的函数,并且一个爱好具有的价值越高,它们就越有可能被选中。

我无法弄清楚如何将最后一部分翻译成代码。使用这些变量例如:

    int fishing = 25;
    int sleeping = 25;
    int drinking = 50;
    int running = 0;

3 个答案:

答案 0 :(得分:0)

这对你有用:

std::unordered_set

这假设您已经拥有了行动及其百分比。现在,如果任何2个(或更多)项目具有相同的百分比,它将显示添加到列表中的第一个项目。

修改

抱歉没有得到随机化的要求。试试这个:

 class Program
{
    private static List<KeyValuePair<string, int>> Actions = new List<KeyValuePair<string, int>>()
    {
        new KeyValuePair<string, int>("fishing", 25),
        new KeyValuePair<string, int>("sleeping", 25),
        new KeyValuePair<string, int>("drinking", 5),
        new KeyValuePair<string, int>("running", 0),
    };

    static void Main(string[] args)
    {
        var result = Actions.OrderByDescending(r => r.Value).First();

        Console.WriteLine(result.Key);
    }
}

就像这样,无论你添加到var listOfActionsToTake = new List<string>() { "fishing", "sleeping", "drinking", "running" }; var listOFActions = new List<KeyValuePair<string, int>>(); var rand = new Random(); var currentPercentage = 101; for (int i = 0; i < listOfActionsToTake.Count; i++) { var current = rand.Next(currentPercentage); if (i == listOfActionsToTake.Count - 1) { current = currentPercentage - 1; } listOFActions.Add(new KeyValuePair<string, int>(listOfActionsToTake[i], current)); currentPercentage -= current; } foreach (var action in listOFActions) { Console.WriteLine($"{action.Key}: {action.Value}"); } var result = listOFActions.OrderByDescending(r => r.Value).First(); Console.WriteLine(result.Key); 多少个值,你总会得到100之间的总和,并且最大值将被选中

答案 1 :(得分:0)

我找到this示例,似乎有道理。您可以添加值以获取累积值。如果创建的随机值小于累积概率,则选择当前项目。

基本上,如果该条件为假,那么您忽略条件中的当前项概率。因此,现在要比较的下一个项目有更高的选择概率。

例如:

// 1. RandNum = 0.4
// 2. cumulative = 0.0
// 3. fishing = 0.25
// 4. cumulative = cumulative + fishing = 0.25
// 5. RandNum < cumulative ? false

随机数为0.4,钓鱼的可能性为0.25。由于钓鱼的概率低于随机数,我们将其添加到累积值,并在下一个项目中基本忽略它。现在,下一个项目的选择概率更高,因为它现在只有sleepingdrinking。他们现在都有.50概率被选中。

// 1. RandNum = 0.4
// 2. cumulative = 0.25
// 3. sleeping = 0.25
// 4. cumulative = cumulative + sleeping = .50
// 5. RanNum < cumulative ? true

虽然您必须修改它以说明百分比相等的时间,因为它只需要第一个。在找到初始行动后,您可以检查百分比是否相同。如果随机选择的操作具有与另一个相同的百分比,则随机选择其中一个。

static void Main(string[] args)
{
    int fishing = 25;
    int sleeping = 25;
    int drinking = 50;
    int running = 0;

    List<KeyValuePair<string, double>> elements = new List<KeyValuePair<string, double>>();
    elements.Add(new KeyValuePair<string, double>("fishing", (fishing * (1.0 / 100.0)))); // 25 * (1 /100) = .25
    elements.Add(new KeyValuePair<string, double>("sleeping", (sleeping * (1.0 / 100.0))));
    elements.Add(new KeyValuePair<string, double>("drinking", (drinking * (1.0 / 100.0))));
    elements.Add(new KeyValuePair<string, double>("running", (running * (1.0 / 100.0))));


    Random r = new Random();
    double rand = r.NextDouble();

    double cumulative = 0.0;
    string selectedElement = "";
    for (int i = 0; i < elements.Count; i++)
    {
        cumulative += elements[i].Value;
        if (rand < cumulative)
        {
            selectedElement = elements[i].Key;
            break;
        }
    }
    Console.WriteLine("Selected Element: " + selectedElement);
    Console.ReadKey();
}

// Test 1: rand: 0.522105917
//         cumulative: 1
//         Selected Element: drinking
// Test 2: rand: 0.49201479
//         cumulative: 0.5
//         Selected Element: sleeping

答案 2 :(得分:0)

这应该这样做,并且当它们也不加100时也能正常工作。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static Dictionary<string, int> activities = new Dictionary<string, int>
    {
        { "running", 0 },
        { "fishing", 25 },
        { "sleeping", 25 },
        { "drinking", 50 }
    };

    static void Main(string[] args)
    {
        int sum = activities.Sum(a => a.Value);
        int rand = new Random().Next(sum);
        int total = -1;
        string activity = activities.SkipWhile(a => (total += a.Value) < rand).First().Key;
        Console.WriteLine(activity);
    }
}