问题陈述:使用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提前致谢。
答案 0 :(得分:3)
如果我们想严格遵循%,哪一个更准确?例如,每100位客户为1位客户提供100%的折扣。
两者都没有,因为那不再是随机的。如果您想要在给定间隔内进行精确分布,则必须使用不同的策略。使用您想要的值分布填充Collection
,将其随机播放,并将值分配给您的客户。
答案 1 :(得分:1)
分布是均匀的,因此在这种情况下高斯分布的用途有限。统一分布是您所需要的。
我对你所面临的问题的理解是,你希望结果具有一定的分布(过多的折扣可能非常昂贵),但是否则它应该是随机的,因为在不可预测的情况下。如果你只是对100个可能的折扣进行了安排,对它们进行了分类,并在一个周期中使用它们,那么这种安排是可以预测的。即使你改变每个周期100的顺序,有人注意可能知道获得良好折扣的几率会高于或低于正常水平(有点像二十一点的计数卡)。
我认为您需要的是Reservoir Sampling算法。最简单的方案是,如果您知道将会有多少项目(比方说有多少折扣券),以及是否有两个类别(赢家,输家)。然后,维基百科文章中的代码可以按原样使用。问题似乎有较少的文献有多个类别(100%,20%,10%,1%),并且不知道完整数量的优惠券(如果它是一个有时间限制的促销,比如说)。我一直在寻找有关这个主题的论文,但我认为这是一般性的想法。
答案 2 :(得分:0)
我认为准确度是一样的。但我更喜欢nexInt,因为在这种情况下计算slab更容易。