2011-03-16 17 views
0

我正在开发一个电子商务网站(在asp.net & c#中),我想实现“幸运抽奖”功能。控制流程如下: - 用户将购买一个特定的产品那么我需要从那些购买该产品的用户中选择一位用户作为当天的运气抽奖赢家。如何在C#中实现“抽奖”功能?

我关于执行抽奖最初的想法是使用由C#提供的随机函数。而且有很多的想法来到我的脑海里像..

  1. 如何有效的将是如果只有我在c#中使用随机函数?
  2. 如果我为此目的实现任何随机数生成算法会更好吗?
  3. 是否有任何算法可用于从组中随机选择?

我接受你的宝贵意见和建议。

感谢
亚历克斯

回答

2
  1. 标准Random类应该足够了,只要确保你每天都使用一个独特的种子(比如每个购买数据的散列)。如果您的应用程序始终每天以完全相同的时间启动,那么使用时间作为种子(调用不带参数的随机构造函数)可能会很糟糕。
  2. 标准的.NET库足以满足统计过程的需要。如果您认为您需要更强大的版本,请使用.NET的标准RNGCrypto库。除非你每天都有成千上万的买家,否则我不认为你真的需要加密版本。不要自己实现算法。人们使用标准化的随机库是有原因的,因为它已经根据随机性的统计要求进行了测试。
  3. 呃...如果您需要以相同的概率挑选几个幸运客户,只需将它们放在一个List中,生成一个介于0和List长度之间的整数。您获得的整数是第一个幸运客户,将其存储在某个地方,将其从列表中移除,然后冲洗并为下一个幸运客户重复。 如果您需要根据购买次数给出更高的概率,请将购买详情存储在列表中,而不是客户。如果您需要根据购买价值自定义重量,请使用Fitness proportion,其中您总计当天的所有购买价值,然后为每个客户购买其累计价值。例如,如果当天总共售出350美元,第一个购买75美元的顾客得到75,第二个顾客购买20美元得到95(75 + 20),第三个顾客购买10美元得到105(95 + 10)等等。然后,从0到总销售额之间选择一个随机整数,幸运获胜者是最低值的客户仍然高于生成的整数。从列表中删除第一个获胜者(包括他们的总数和位置),冲洗并重复下一个客户。
4
  1. C#有没有随机函数。它使您可以访问.NET库。请使用Math.Random。请使用.NET BCL提供的加密RNG之一。如果你每天只做一次或两次,那么加密强度RNG的额外复杂性就不会成为问题。

0

在我看来,它最多可以选择的人数。如果它只是一个,我会使用Random()或Ben Voigt建议的。

如果它更复杂的幸运抽奖,您可能需要组合和排列算法的帮助。