java SecureRandom nextInt()vs nextGaussian()

时间:2015-08-26 18:18:18

标签: java math random

问题陈述:使用X%折扣的幸运抽奖券在1%至100%之间奖励客户

假设平板是预先定义的(都是理论上的)

  

1%折扣:90%客户

     

10%折扣:5%客户

     

20%折扣:3%客户

     

100%折扣:2%客户

解决方案1:

对于每100个客户,我将预先填充一个大小为100的随机数组,并使用良好的混洗算法

  

90 1s(1 = 1%折扣)

     

5 10s(10 = 10%折扣)

     

3 20s(20%折扣)

     

2 100s(100%折扣)

每当有顾客到来时,我会绘制random.nextInt(100)并获得折扣百分比

解决方案2:

使用SecureRandom的nextGaussian(),因为它是一种分布式随机算法。

如果我们想严格遵循%,哪一个更准确?

请参阅Random

中的示例1和3

提前致谢。

3 个答案:

答案 0 :(得分:3)

  

如果我们想严格遵循%,哪一个更准确?例如,每100位客户为1位客户提供100%的折扣。

两者都没有,因为那不再是随机的。如果您想要在给定间隔内进行精确分布,则必须使用不同的策略。使用您想要的值分布填充Collection,将其随机播放,并将值分配给您的客户。

答案 1 :(得分:1)

分布是均匀的,因此在这种情况下高斯分布的用途有限。统一分布是您所需要的。

我对你所面临的问题的理解是,你希望结果具有一定的分布(过多的折扣可能非常昂贵),但是否则它应该是随机的,因为在不可预测的情况下。如果你只是对100个可能的折扣进行了安排,对它们进行了分类,并在一个周期中使用它们,那么这种安排是可以预测的。即使你改变每个周期100的顺序,有人注意可能知道获得良好折扣的几率会高于或低于正常水平(有点像二十一点的计数卡)。

我认为您需要的是Reservoir Sampling算法。最简单的方案是,如果您知道将会有多少项目(比方说有多少折扣券),以及是否有两个类别(赢家,输家)。然后,维基百科文章中的代码可以按原样使用。问题似乎有较少的文献有多个类别(100%,20%,10%,1%),并且不知道完整数量的优惠券(如果它是一个有时间限制的促销,比如说)。我一直在寻找有关这个主题的论文,但我认为这是一般性的想法。

答案 2 :(得分:0)

我认为准确度是一样的。但我更喜欢nexInt,因为在这种情况下计算slab更容易。