2013-04-27 89 views
0

我真的很抱歉,我会搜索我的问题,但我不知道如何正确地说出它,我有一个心理数学的大问题,我一直在想办法解决。我正在尝试为我的公会建立一个程序,将名字添加到列表中。该列表对于每个条目具有并行结构,该条目将人的姓名和捐赠数目保存到抽奖中。受影响的随机化

我想随机化所有名称,并且结果会受到人们捐款额的积极影响。喜欢的可能性增加1%或1%*捐款数量。我之前做过随机分组,但我从来没有必要轻微影响赔率。请帮帮我?我会发布代码,但我没有任何随机化的时间。我可以给你,尽管一些其他的东西:

我做了一个结构来保存每个用户的条目:

public struct pEntry 
    { 
     public string Name; 
     public int Entries; 
    } 

我做了一个列表,保存所有条目:

public List<pEntry> lEntries = new List<pEntry>(); 

我想我的随机化受到他们所做的项目数量(捐赠)的积极影响。这没有上限可以去,但如果我需要也许我可以使它像.. 255.它随机后会选择显示一条消息说,该用户已赢得,它会从列表中删除该条目并选择更多。这个程序将用于多个抽奖和类似的事情,但都使用相同的系统。

+6

为什么不只是有一个字符串列表;任何购买两张票的人都会被列入清单两次。如果他们购买三张门票,他们将被列入名单三次。然后从列表中选择一个随机项目。毕竟,这就是它真正与真正的纸质票证一起工作的方式。 – 2013-04-27 00:40:16

+0

如果你需要快速和肮脏的东西,你可以为每个条目添加一个入口到临时数组。然后你可以随机化该集合的索引。编辑:@EricLippert打我吧=) – TyCobb 2013-04-27 00:40:37

+3

还请注意,如果在这里有严重的金钱,那么你应该使用*密码安全的随机性*。 Math.Random生成的“随机”数字实际上具有高度可预测性;它们只是伪随机的。 – 2013-04-27 00:44:03

回答

2

您需要知道捐赠多少会增加获胜的机会。 1 =比没有捐赠的人多1倍?一旦你有一个基础和一个奖金,你可以生成一个“图表”,看看你的头号是什么,并生成一个随机数。之后,您可以删除该人员或重新设置他们的机会,重新创建机会列表并生成新的号码。例如,如果你想要1个捐赠单位给予该人10%的机会,那么你可以产生一个所有公会的名单,每个捐赠单位每个人获得10个“地段”+ 1个地段。所以,如果你有3人,其中:

  • 安给了捐赠5台
  • 汤姆给2个捐赠单位
  • 鲍勃没有给出任何

结果列表将是:

  1. 安很多计数:10(基峰)+ 5(捐赠)= 15个批次
  2. 汤姆很多数:10(基)+ 2(捐赠)= 12个批次
  3. 鲍勃很多数:10(基峰)+ 0(无捐赠)= 10手

然后就产生1和37(15 + 12之间的一个数+ 10)确定胜利者。

找出每个捐赠应该提高他们的赔率(增加他们的地段),然后你可以开始建立你的范围和生成你的数字。