Php 从数千名可能拥有数百张彩票的用户中选择抽奖彩票赢家

Php 从数千名可能拥有数百张彩票的用户中选择抽奖彩票赢家,php,mysql,sql,Php,Mysql,Sql,我正在创建一个抽奖活动,目前有一个带有用户名和分配给他们的票数的数据库。我能想到的唯一公平的方法是公平地选择一个获胜者,即你拥有的门票越多,获胜的几率就越高;是通过创建一个单独的表,其中列出的用户名乘以他们拥有的票证数量,然后随机选择一个。这将创建一个庞大的数据库。选择获胜者的最佳方式是什么?最好通过PHP 编辑*用户获得票证,即+1到“票证”。这些票实际上没有分配任何东西使它们与其他票不同 用户名票证 铁皮人55 提前感谢您。您只需要一张用户和彩票号码表 John 108 John 109

我正在创建一个抽奖活动,目前有一个带有用户名和分配给他们的票数的数据库。我能想到的唯一公平的方法是公平地选择一个获胜者,即你拥有的门票越多,获胜的几率就越高;是通过创建一个单独的表,其中列出的用户名乘以他们拥有的票证数量,然后随机选择一个。这将创建一个庞大的数据库。选择获胜者的最佳方式是什么?最好通过PHP

编辑*用户获得票证,即+1到“票证”。这些票实际上没有分配任何东西使它们与其他票不同

用户名票证 铁皮人55


提前感谢您。

您只需要一张用户和彩票号码表

John  108
John  109
John  110
Paul  111

约翰获胜的机会是保罗的3倍。

您可以使用此功能:

/**
* getRandomWeightedElement()
* Utility function for getting random values with weighting.
* Pass in an associative array, such as array('A'=>5, 'B'=>45, 'C'=>50)
* An array like this means that "A" has a 5% chance of being selected, "B" 45%, and "C" 50%.
* The return value is the array key, A, B, or C in this case.  Note that the values assigned
* do not have to be percentages.  The values are simply relative to each other.  If one value
* weight was 2, and the other weight of 1, the value with the weight of 2 has about a 66%
* chance of being selected.  Also note that weights should be integers.
* 
* @param array $weightedValues
*/
function getRandomWeightedElement(array $weightedValues) {
  $rand = mt_rand(1, (int) array_sum($weightedValues));

  foreach ($weightedValues as $key => $value) {
    $rand -= $value;
    if ($rand <= 0) {
      return $key;
    }
  }
}
/**
*getRandomWeightedElement()
*用于获取带有权重的随机值的实用函数。
*传入关联数组,例如数组('A'=>5,'B'=>45,'C'=>50)
*这样的数组意味着“A”被选中的几率为5%,“B”为45%,而“C”为50%。
*在本例中,返回值是数组键A、B或C。请注意,指定的值
*不必是百分比。这些值只是相对的。如果一个值
*权重为2,另一个权重为1,权重为2的值约为66%
*被选中的机会。还要注意权重应该是整数。
* 
*@param数组$weightedValues
*/
函数getRandomWeightedElement(数组$weightedValues){
$rand=mt_rand(1,(int)数组_和($weightedValues));
foreach($key=>$value的加权值){
$rand-=$value;

如果($rand hmmm,你的意思是创建另一个表而不是数据库来进行选择吗?你所需要的只是一个随机数生成器;它会给出一个数字,你需要一个转换来将该数字映射到你的一个用户名-票证组合。你的抽奖活动正在被审核吗?如果是,审核的详细程度如何?你需要什么样的证据你需要继续证明它是公平进行的?是的!太好了,我会尝试一下。谢谢你,如果可以的话,我会投票给你。