根据MySQL数据库中的库存随机生成数字

时间:2013-03-21 12:40:56

标签: php mysql

大家好我需要一些帮助,我在Php制作的剧本,目前它被设置为一个插槽式游戏,用户可以支付一点钱,生成3个随机数,每个数字链接到一个他们可以赢得奖品。比赛3并赢得所述奖品。

不幸的是,由于我不会总是将每件商品都作为奖品赠送,我需要一种方法来检查每个数字并确保它有货

$stock = $conn -> query('SELECT DISTINCT ItemID FROM codes WHERE Available = 1');

如果有库存,请将其添加到算法中,该算法将随机选取3个数字

目前我有这样的设置

function generate_numbers(){
global $numbers;
$numbers = array(
'0' => rand(1,2),
'1' => rand(1,2),
'2' => rand(1,2)
);
display_numbers();
}

根据两个变量生成数字,每个数字都链接到一个奖品,显然它没有考虑哪些数字有库存,这将导致我发放我没有的奖品,并且它不允许有优势

我需要一种简单的方法来检查物品是否有库存,如果有库存,它会被添加到可以获胜的奖品列表中,我需要它有一个优势,所以会出现一些奖品(很多)基于简单值的代码X比其他代码更频繁出现的概率为0.25%,并且cody Y有50%的概率出现。

如果我用更大范围的数字进行设置......

function generate_numbers(){
global $numbers;
$numbers = array(
'0' => rand(1,100),
'1' => rand(1,100),
'2' => rand(1,100)
);
display_numbers(); }

if (($numbers[0] > 0) && ($numbers[0] < 40)){
echo "you win prize x";
else if (($numbers[0] > 40) && ($number[0] < 50)){
echo "you win prize y";
else {
echo "you win prize z";
}

...我仍然要么给出我没有的奖品 - 或者我可以添加一个嵌入式if else来检查代码是否有库存,如果它是给出的,如果它不是给不奖品或给予默认奖品。

但是这意味着我的股票代码越多,他们被给予的机会就越大,我不想这样做我真的希望它在预定义的赔率下完全公平。

所以希望所有这些都有意义,这不是一个过于复杂的问题,但我认为这是一个不寻常的问题

感谢阅读,我期待听到您的想法

3 个答案:

答案 0 :(得分:3)

扫描您的问题,我认为您需要更改查询

$stock = $conn -> query('SELECT DISTINCT ItemID FROM codes WHERE Available = 1 ORDER BY RAND()');

用这个你选择前3个,你有3个随机奖品,

这是一个快速的解决方案。有机会让它更复杂让我想想......

修改

经过一些测试后我觉得我明白了,

你需要在顶部添加一个chance列,这将是一个数字,然后该记录出现的概率为N,

代码所在的额外内容:

0 = FLOOR(RAND()*chance)

所以最终的代码是

$stock = $conn ->query(
    'SELECT DISTINCT ItemID FROM codes WHERE Available = 1 AND 0 = FLOOR(RAND()*chance) ORDER BY RAND()'
);

答案 1 :(得分:0)

如果我理解你的话,你可以先从查询开始创建一系列可用的奖品。

所以数组将是:

{0 => prize1_id,
 1 => prize3_id,
 2 => prize4_id,
 // ...and so on
 }

然后你可以使用随机数而不是奖品ID,而是数组索引(键)。

如果您希望某些项目有更多机会被选中,您可以添加两次,例如。

答案 2 :(得分:0)

您可以这样做的一种方法(如果您没有很多项)是创建ItemID的数组并在数组上使用shuffle()。然后选择前三个元素(或使用rand()mt_rand()将此选择随机化)为您显示的数字。这样您就可以选择不存在的项目。您可以更改此算法以检查库存水平,以便在您决定时不添加没有库存或库存不足的ItemID(可以通过codes中的新列定义所需的最小库存要选择的项目。)

要获得优势,您可以为要更频繁选择的项目添加多个重复ItemID个。您可以向codes表添加另一列以指示要包含特定项目的次数,因此至少为3(以匹配三个数字),您可以为{{1}分配更大的值您希望通过算法更频繁地选择。它也有可能为你不想放弃的物品加0。