我是C#的新手。
我要做什么
我试图在这里创建一个机会游戏系统。
基本上是这样的:
我的问题:我该怎么做才能完成我想做的事情?
最佳答案
您的示例代码有一个很难的错误:您已经编写了150/208
和190/209
。这是一个整数除法,并且两者都导致零。您应该已经编写了:150.0/208
和190.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),则命中第二个类型。依此类推。