我是C#的新手。

我要做什么

我试图在这里创建一个机会游戏系统。

基本上是这样的:

我的问题:我该怎么做才能完成我想做的事情?

最佳答案

您的示例代码有一个很难的错误:您已经编写了150/208190/209。这是一个整数除法,并且两者都导致。您应该已经编写了:150.0/208190.0/209,以指示编译器将其划分为double而不是整数。

编辑:
假设系统的RNG是平坦的,并且您的表如下所示:

[item]    [amount]
0        3 000 000
25       1 500 000
50       2 000 000
75       300 000
100      10 000
150      10 000    (no typo)
  sum  = 6820000

然后您的随机化器可能看起来像:
int randomItemNumber = Random.Next(6820000); // 0..6819999
if(randomItemNumber < 3000000)
    Console.WriteLine("Aah, you've won the Item type #0\n");
else if(randomItemNumber < 3000000+1500000)
    Console.WriteLine("Aah, you've won the Item type #1\n");
else if(randomItemNumber < 3000000+1500000+2000000)
    Console.WriteLine("Aah, you've won the Item type #2\n");
else if(randomItemNumber < 3000000+1500000+2000000+300000)
    Console.WriteLine("Aah, you've won the Item type #3\n");
else if(randomItemNumber < 3000000+1500000+2000000+300000+10000)
    Console.WriteLine("Aah, you've won the Item type #4\n");
else if(randomItemNumber < 3000000+1500000+2000000+300000+10000+10000)
    Console.WriteLine("Aah, you've won the Item type #5\n");
else
    Console.WriteLine("Oops, somehow you won nothing, the code is broken!\n");

这个想法是,您将所有项目一个接一个地放到一行中,但是将它们放在它们的组中。因此,开始时有第一种的3百万,然后是第二种的3百万,依此类推。该行共有6820000个项目。现在,您随机选择一个从1到6820000(或从0到6819999)的数字,并将其用作LINE中元素的NUMBER。

由于项目以正确的统计分布出现在行中,因此,如果随机数1-6820000为FLAT,则生成的“彩票”将完全按照您的期望进行分布。

剩下要解释的唯一技巧是如何猜测选择了哪个项目。这就是为什么我们将项目分组的原因。 3000000项的第一部分是第一种类型,因此,如果数量少于3000000,则我们命中第一种类型。如果大于此值,但小于下一个1500000(小于4500000),则命中第二个类型。依此类推。

10-06 11:21