Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# ed,但没有固定的字段。只是测试一下,但正如你们所说的,最好的方法是在数据库中设置字段,最后我可能会这么做。@JensB我很想看看它的性能如何。谁知道呢,也许对你的申请来说就足够了。关于我的答案还有一点:如果你不想添加字段的话,你可以将概率保存在一个单独的_C#_Linq_Lambda - Fatal编程技术网

C# ed,但没有固定的字段。只是测试一下,但正如你们所说的,最好的方法是在数据库中设置字段,最后我可能会这么做。@JensB我很想看看它的性能如何。谁知道呢,也许对你的申请来说就足够了。关于我的答案还有一点:如果你不想添加字段的话,你可以将概率保存在一个单独的

C# ed,但没有固定的字段。只是测试一下,但正如你们所说的,最好的方法是在数据库中设置字段,最后我可能会这么做。@JensB我很想看看它的性能如何。谁知道呢,也许对你的申请来说就足够了。关于我的答案还有一点:如果你不想添加字段的话,你可以将概率保存在一个单独的,c#,linq,lambda,C#,Linq,Lambda,ed,但没有固定的字段。只是测试一下,但正如你们所说的,最好的方法是在数据库中设置字段,最后我可能会这么做。@JensB我很想看看它的性能如何。谁知道呢,也许对你的申请来说就足够了。关于我的答案还有一点:如果你不想添加字段的话,你可以将概率保存在一个单独的表中,以便在逻辑上将其与其他数据分开。我认为这也会在O(n)时间内运行,并且会使用更多的内存(因为你正在创建一个更大的列表)? A - 100 B - 50 C - 10 A - 6249 (100 / 160 = 0,625) B - 3


ed,但没有固定的字段。只是测试一下,但正如你们所说的,最好的方法是在数据库中设置字段,最后我可能会这么做。@JensB我很想看看它的性能如何。谁知道呢,也许对你的申请来说就足够了。关于我的答案还有一点:如果你不想添加字段的话,你可以将概率保存在一个单独的表中,以便在逻辑上将其与其他数据分开。我认为这也会在O(n)时间内运行,并且会使用更多的内存(因为你正在创建一个更大的列表)?
A - 100
B - 50
C - 10
A - 6249  (100 / 160 = 0,625)
B - 3139  (50  / 160 = 0,3125)
C - 612   (10  / 160 = 0,0625)
public long GetRandomItem()
{
    var allItems = _db.AllItems
        .Where(x => x.CanBeFound == true)
        .OrderByDescending(x => x.Rarity)
        .Select(x => new
        {
            x.Id,       // id of item
            x.Rarity,   // rarity between 1 and 100
        }).ToList();

    int totalRarity = allItems.Sum(x => x.Rarity);
    var random = new Random(DateTime.Now.Millisecond);

    var randomNumber = random.NextDouble() * totalRarity;

    double totalSoFar = 0;
    long chosenId = -1;
    foreach (var i in allItems)
    {
        totalSoFar += i.Rarity;
        if (totalSoFar > randomNumber)
        {
            chosenId = i.Id;
            break; 
        }
    }

    return chosenId;
}
public long GetRandomGamePiece()
{
    int totalRarity = _db.GamePieceTemplates.Sum(x => x.Rarity);
    var randomNumber = 1 + Math.Round(_Random.NextDouble() * (totalRarity - 1)); 

    var randomItem = _db.GamePieceTemplates
        .Where(x => x.CanBeFound == true)
        .OrderBy(x => x.Id)
        .Select((x) => new
        {
            x.Id,       // id of item
            x.Rarity,   // rarity between 1 and 100

            // +1 so that it dosent overlap previous level
            MinRarity = _db.GamePieceTemplates.Where(y => y.Id <= x.Id).Sum(y => y.Rarity) - x.Rarity + 1, 
            MaxRarity = _db.GamePieceTemplates.Where(y => y.Id <= x.Id).Sum(y => y.Rarity)
        })
        .Single(x => x.MinRarity <= randomNumber && x.MaxRarity >= randomNumber);

    long chosenId = -1;
    return  randomItem.Id;
}
SELECT TOP (2) 
    [Project6].[Rarity] AS [Rarity], 
    [Project6].[Id] AS [Id], 
    [Project6].[C1] AS [C1], 
    [Project6].[C2] AS [C2]
    FROM ( SELECT 
        [Project5].[Id] AS [Id], 
        [Project5].[Rarity] AS [Rarity], 
        ([Project5].[C1] - [Project5].[Rarity]) + 1 AS [C1], 
        [Project5].[C2] AS [C2]
        FROM ( SELECT 
            [Project4].[Id] AS [Id], 
            [Project4].[Rarity] AS [Rarity], 
            [Project4].[C1] AS [C1], 
            (SELECT 
                SUM([Extent5].[Rarity]) AS [A1]
                FROM [dbo].[GamePieceTemplates] AS [Extent5]
                WHERE [Extent5].[Id] <= [Project4].[Id]) AS [C2]
            FROM ( SELECT 
                [Project3].[Id] AS [Id], 
                [Project3].[Rarity] AS [Rarity], 
                (SELECT 
                    SUM([Extent4].[Rarity]) AS [A1]
                    FROM [dbo].[GamePieceTemplates] AS [Extent4]
                    WHERE [Extent4].[Id] <= [Project3].[Id]) AS [C1]
                FROM ( SELECT 
                    [Project2].[Id] AS [Id], 
                    [Project2].[Rarity] AS [Rarity]
                    FROM ( SELECT 
                        [Project1].[Id] AS [Id], 
                        [Project1].[Rarity] AS [Rarity], 
                        [Project1].[C1] AS [C1], 
                        (SELECT 
                            SUM([Extent3].[Rarity]) AS [A1]
                            FROM [dbo].[GamePieceTemplates] AS [Extent3]
                            WHERE [Extent3].[Id] <= [Project1].[Id]) AS [C2]
                        FROM ( SELECT 
                            [Extent1].[Id] AS [Id], 
                            [Extent1].[Rarity] AS [Rarity], 
                            (SELECT 
                                SUM([Extent2].[Rarity]) AS [A1]
                                FROM [dbo].[GamePieceTemplates] AS [Extent2]
                                WHERE [Extent2].[Id] <= [Extent1].[Id]) AS [C1]
                            FROM [dbo].[GamePieceTemplates] AS [Extent1]
                            WHERE 1 = [Extent1].[CanBeFound]
                        )  AS [Project1]
                    )  AS [Project2]
                    WHERE ( CAST( ([Project2].[C1] - [Project2].[Rarity]) + 1 AS float) <= 130) AND ( CAST( [Project2].[C2] AS float) >= 130)
                )  AS [Project3]
            )  AS [Project4]
        )  AS [Project5]
    )  AS [Project6]
    ORDER BY [Project6].[Id] ASC
int maxValueA = 100;
int maxValueB = 50;
int maxValueC = 10;
int total = maxValueA + maxValueB + maxValueC;

int x = random number between zero and total;

if (x <= maxValueA) return A;
else if (x <= maxValueA + maxValueB) return B;
else return C;
int[] IDsList = { A, A, A, A, B, B, C }; // ID's populated based on % chance being chosen

x = random int between 0 and IDsList.Count;

return IDsList[x];
Id AccumP
A  100
B  150
C  160
void Main()
{
    var items = new int [] {100,50,10};
    var dict = new Dictionary<int,int>();
    var test = Enumerable.Range(1,10000);
    foreach (var t in test)
    {
        var result = SelectItem(items);
        if (!dict.ContainsKey(result))
        {
            dict.Add(result,0);
        }
        dict[result]++;
    }

    foreach (var d in dict.Keys)
    {
        Console.WriteLine("{0} - {1}",d,dict[d]);
    }


}

private static Random rand = new Random(DateTime.Now.Millisecond);
private int SelectItem(IEnumerable<int> numbers)
{
    var num = rand.Next(1,numbers.Sum());
    var list = numbers.OrderBy(n=>n)
        .SelectMany(n=> Enumerable.Range(1,n).Select(rr=>n)).ToList();
    //list.GroupBy(x=>x).Dump();
    //Console.WriteLine("Rand num = {0}, selected num = {1}",num,ret);
    return  list[num-1];;
}