【问题标题】:Random Probability PHP [duplicate]随机概率 PHP [重复]
【发布时间】:2017-10-01 19:33:25
【问题描述】:

我正在开发一款游戏,用户可以偷车。但是,当点击“偷车”时,我需要让更好的车更难偷(1号车最难,2号车次之……等等)。

目前我的 PHP 脚本中有一组随机概率,尽管它似乎不起作用。感觉好像每辆车都同样难以偷窃。作为旁注,您会看到每辆车一旦被盗就会产生自己的照片。有人可以帮忙吗?谢谢!

if($query1>="3"){


$random_car = rand (0,99);


if (($random_car)>98)
{$car = $car_1; $pic = $car1_pic;}
else
{
if (($random_car)>97)
{$car = $car_2; $pic = $car2_pic;}
else
{
if (($random_car)>94)
{$car = $car_3; $pic = $car3_pic;}
else
{
if (($random_car)>86)
{$car = $car_4; $pic = $car4_pic;}
else
{
if (($random_car)>77)
{$car = $car_5; $pic = $car5_pic;}
else
{
if (($random_car)>72)
{$car = $car_6; $pic = $car6_pic;}
else
{
if (($random_car)>65)
{$car = $car_7; $pic = $car7_pic;}
else
{
if (($random_car)>58)
{$car = $car_8; $pic = $car8_pic;}
else
{
if (($random_car)>48)
{$car = $car_9; $pic = $car9_pic;}
else
{
if (($random_car)>35)
{$car = $car_10; $pic = $car10_pic;}
else
{
if (($random_car)>19)
{$car = $car_11; $pic = $car11_pic;}
else
{
if (($random_car)>1)
{$car = $car_12; $pic = $car12_pic;}
else
{

$car = $car_13; $pic = $car13_pic;

}//car 12 else
}//car 11 else
}//car 10 else
}//car 9 else
}//car 8 else
}//car 7 else
}//car 6 else
}//car 5 else
}//car 4 else
}//car 3 else
}//car 2 else
}//car 1 else

【问题讨论】:

  • else if(something){ ... }switch()
  • 似乎每辆车都有1/100的机会被选中。随机数字不会增加难度只是为了更高或更低的数字。

标签: php random probability


【解决方案1】:

我建议将所有这些逻辑实现为数据。

例如:

生成随机车辆

<?php

  $cars = [
    ["Buick", "buick.jpg" ],
    ["Mazda", "mazda.jpg" ],
    ["Honda", "honda.jpg" ],
    ["Acura", "acura.jpg" ],
    ["Dodge", "dodge.jpg" ],
    ["Tesla", "tesla.jpg" ],
    ["Volvo", "volvo.jpg" ],
    ["Ford",  "ford.jpg"  ],
    ["Kia",   "kia.jpg"   ],
    ["Audi",  "audi.jpg"  ],
    ["BMW",   "bmw.jpg"   ],
    ["Camry", "camry.jpg" ],
    ["Lexus", "camry.jpg" ],  # Lexus is just a Camry with a leather interior
  ];

  $frequency_table = [ 1, 19, 35, 48, 58, 65, 72, 77, 86, 94, 97, 99, 101 ];

  $r = rand(0,99);

  for ($ix = 0; $frequency_table[$ix] < $r; ++$ix );

  list($name, $img) = $cars[$ix];

  echo "You stole a $name <img src=/images/$img>\n";
?>

输出

You stole a Dodge <img src=/images/dodge.jpg>

...

You stole a Ford <img src=/images/ford.jpg>

【讨论】:

    【解决方案2】:

    您的 if 语句看起来有点连线。我认为你可以更容易地编写它们,而不是把这么大的 if 结构装箱。这是一个较短的版本,您可以在其中使用您的值定义一个数组。

    $carsSpecs = [
        '1' => [
            'min' => 97,
            'max' => 98,
            'car' => 123,
            'carpic' => 'test.jpeg'
        ],
    ];
    
    $random_car = rand(0,99);
    $car = '';
    $pic = '';
    
    foreach($carsSpecs as $car) {
        if($random_car > $car['min'] && $random_car < $car['max']) {
            $car = $car['car'];
            $pic = $car['carpic'];
        }
    }
    

    现在您可以定义数组中的每辆汽车并更轻松地使用它们。也许你有一个现有的数组,你可以直接使用它们。

    还有一些其他样式可用于数组,但要复杂得多。

    最后一件事是你应该在数字之间扩大范围。

    【讨论】:

      【解决方案3】:

      您觉得随机化效果不佳的原因是您没有在选项之间创建足够大的边距。

      对于汽车 1,只有在 $random_car 为 99 或 100 时才会被选中。只有在 $random_car 为 97 或 98 时才会选择汽车 2,仅此而已。如果是 99 或 100,那么将选择汽车 1,因此汽车 1 和汽车 2 被选择的概率相同。列表底部的汽车被选中的可能性更高,但利润率并没有那么高。

      汽车 1 有 100 分之一的机会被选中,而汽车 12 有 100 分之一的机会被选中。这是我看到的最大利润。

      就您的代码而言,那些嵌套的 if 语句是一场噩梦。我会使用以下语法重写它们:

      if() {
        // do something
      }
      elseif() {
        // do something else
      }
      else {
        // do if nothing else worked
      }
      

      【讨论】:

        猜你喜欢
        • 2017-10-01
        • 2011-04-10
        • 2017-03-24
        • 2012-10-06
        • 2017-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多