我有一个代码来编码兰德数,并根据获胜者的机会向获奖者展示。
$data = array();
foreach($getAllUserTicketHistoryJson as $value){
$data[$value['user_id']] = number_format((float)($value['total_ticket'] / $getAllTicketRound * 100), 2, '.', '');
}
$array=$data;
function chance($input=array())
{
$number=rand(0,array_sum($input));
$starter=0;
foreach($input as $key => $val)
{
$starter+=$val;
if($number<=$starter)
{
$ret=$key;
break;
}
}
return 'Winner is '.$ret.'<br/>';
}
for($i=0;$i<3;$i++)
{
echo chance($array).'<br><br>';
}
这将给出如下输出。
Winner is 4
Winner is 3
Winner is 4
问题是,用户“ 4”在第一轮和最后一轮两次获胜。如何防止获胜者赢得两次?
以及如何将每个获奖者插入数据库?
我的数据库看起来像这样
=========================================
id | Round | first | Second | third
=========================================
1 | 1 | 4 | 3 | 1
=========================================
我想将每个优胜者插入数据库“第一”,“第二”和“第三”。因此,优胜者ID不会加倍以防止重复。
请帮助。
答案 0 :(得分:0)
使用更改代码
for($i=0;$i<2;$i++)
{
chance($getAllUserTicketHistoryJson[rand(0,count($getAllUserTicketHistoryJson))]).'<br><br>';
}
function chance($arrWinner = array()){
// the array for winner is
echo "<pre> Winner array : ";
print_r($arrWinner);
echo "</pre>";
}
答案 1 :(得分:0)
APN
尝试此操作...如果出现错误...然后让我知道...或在可能的情况下添加错误提示的屏幕
答案 2 :(得分:0)
<?php
$ticket_numbers = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25);
shuffle($ticket_numbers);
$number_winners_required_per_round = 5;
$winner_count = 0;
$number_of_rounds = 3;
$round_number = 0;
while ( $round_number < $number_of_rounds) {
$round_number++;
echo "Round $round_number:";
while ($winner_count < $number_winners_required_per_round ) {
$winner[$winner_count] = array_pop($ticket_numbers);
echo "<p>The winning ticket number $winner_count is ticket number: {$winner[$winner_count]}</p>";
$winners[$round_number][] = $winner[$winner_count];
$winner_count++;
}
$winner_count = 0;
}
var_dump($winners);
?>
$ ticket_numbers将通过JSON feed填充。每次运行主循环时,都会选择所需数量的获胜者,其彩票号码将从潜在获胜者列表中删除。生成一系列获奖者,这些获奖者将用于将获奖者输入数据库。每张票只能赢一次。
答案 3 :(得分:0)
对于您已经提出的问题,我不会完全准确,但是会为您提供解决问题的另一种方法。让我们首先将机会重新陈述为一个实体,然后将其重命名为工单。每张票都有独特且平等的机会被选中。
让我们说您在X彩票中总共售出了100张彩票。给定的彩票包括5轮回合
$rounds = 1; // starting round
$maxRounds = 5;
$tickets = range( 1, 100 );
如果您需要比较玩家的机率,并持有大量门票,那么您应该从数据库中检索不同的数据集。这将需要一个附加表来保存此数据,但它不应“烹饪”票证出现的机会。如果您需要该统计信息,这是一个示例(在php中)
// total of 100 players
$players = range( 1, 100 );
$players = array_flip( $players );
// assign a random number of purchases per player
for( $i = 1; $i <= 100; $players[$i] = mt_rand( 1, 20 ), ++$i );
这将导致总计
$tickets = range( 1, array_sum( $players ) );
回到原始问题。您现在总共有已售出的tickets
,每个彩票有5轮。因此,
$rounds = 1;
$maxRounds = 5;
while( $rounds <= $maxRounds )
{
$winners = array_rand( $tickets, 3 );
$tickets = array_diff( $tickets, $winners );
shuffle( $winners );
foreach( $winners as $pos => $winner )
{
++$pos;
echo "Loterry: {$rounds} - Price {$pos} - winner is {$winner}<br />";
}
++$rounds;
}
是时候通过一次调整就可以将其存储在数据库中了。因此,为清楚起见,我将重写最后一部分。 注意,因为这是一个简单的示例,是您控制的数据,您可以将其添加到数据库中而无需过滤。
$rounds = 1;
$maxRounds = 5;
$insert = [ ];
while( $rounds <= $maxRounds )
{
$winners = array_rand( $tickets, 3 );
$tickets = array_diff( $tickets, $winners );
shuffle( $winners );
$insert[$rounds][ ] = $rounds;
foreach( $winners as $winner )
{
$insert[$rounds][ ] = $winner;
}
$insert[$rounds] = '(' . implode( ',', $insert[$rounds] ) . ')';
++$rounds;
}
$sql = sprintf( "INSERT INTO `lotteries`( `round`, `first`, `second`, `third` ) VALUES %s;", implode( ', ', $insert ) );
从这里开始,您可以使用此语句在数据库中插入。只需将表名和字段更改为数据库中实际拥有的内容即可。希望对您有帮助