Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP动作比例_Php - Fatal编程技术网

PHP动作比例

PHP动作比例,php,Php,我有3种选择,它们必须以特定的比例发生。 10次中,这是比率: 8x选项1 1x选项2 1x选项3 现在我有以下几点: if (rand(8,10)) { option1(); } elseif (rand(1,10)) { option2(); } elseif (rand(1,10)) { option3(); } 但这是选项1的8倍多。选项2从未出现,选项3很少出现 那么,实现这一目标的正确方法是什么呢?不,这不是正确的方法。您可以使用以下内容: $r = ra

我有3种选择,它们必须以特定的比例发生。 10次中,这是比率:

8x选项1 1x选项2 1x选项3 现在我有以下几点:

if (rand(8,10)) {
    option1();
} elseif (rand(1,10)) {
    option2();
} elseif (rand(1,10)) {
    option3();
} 
但这是选项1的8倍多。选项2从未出现,选项3很少出现


那么,实现这一目标的正确方法是什么呢?

不,这不是正确的方法。您可以使用以下内容:

$r = rand() / getrandmax();
if ($r <= 0.8) {
  option1();
} elseif ($r <= 0.9) {
  option2();
} else {
  option3();
}
<?php

// Store in DB use of options 1, 2 and 3
//  field     value
// -----------------
//  options1   0
//  options2   0
//  options3   0

// If $options1 = 8, $options2= 1 and $options3 = 1, then clear all values from DB

$random = rand(1,3);

if ($random == 1) {
  if ($options1 < 9) { option1(); } else { // tryagain; }
} elseif (
...


// update DB with new value for used option

对不起,代码有点混乱的如果部分,但我想你可以理解。如果您需要完整的代码,请告诉我。

试试这样的代码

$roll = rand(1,10);   
if ($roll == 1) {
    option2();
} elseif ($roll == 2) {
    option3();
} else {
    option1();
} 
如果随机数为时间的10%,则选择2

如果随机数为时间的2 10%,则选择3


如果80%的时间里随机数是任何其他值,选项1。

@cmmi这将无法保持priktop想要的准确比率。谢谢,它比我的版本工作得更好,但是选项3似乎从未出现过?我已经做了25次测试,但没有选择3:@Alec您能说明为什么这不能按要求工作吗?我想知道。0@Alec我只是做了一点基准测试。分布相似,使用0-1方法或rand1,10方法无差异。但有趣的是,0-1方法似乎比1-10方法更快。尽管差异很小,@cmmi priktop希望严格执行概率。所以在一组10个结果中,你需要8个选项1,1个选项2和1个选项3。至少从问题来看,他似乎只想随机排列顺序。db有什么用?概率通常不会也永远不会考虑任何先前或即将发生的事件。因此,这是一种错误的方法。@KingCrunch如果您希望严格执行比率,并且只希望随机顺序,那么您需要一个db来存储结果。你读过密码了吗?