如何让一些随机数比其他随机数出现得更多?

How do I make some random numbers appear more than others?

我正在尝试托管我自己的广告。例如,我希望出价高达 0.25 美元 PPC 的展示次数比出价高达 0.10 美元的展示次数更多。我想将我的数字放入一个随机数组中,出价越高的人展示的展示次数越多。我想我在看错误的逻辑。如果我的逻辑可以指向正确的方向,我也许可以自己找出正确的方法。

您可以简单地在一个数组中多次添加它们(这是一种解决方案;但很可能不是解决此问题的最佳方法)。

让我们假设每个人都有一个重量。对于每给定的十美分,我们将元素复制到数组中。

对于我的示例,我们有 company1 给出了 0.30 美元,company2 给出了 0.10 美元。

你的数组看起来像这样:

$data = array(
  'company1', 'company1', 'company1',
  'company2'
);

但是,这种生成的问题是您的数组可能会变得相当大。对于较大的应用程序,这可能并不理想。

至于最有效的解决方案,我认为你问错了问题——你应该考虑制定自己的算法,让支付更多的人更频繁地出现,而不是基于随机数生成。

我的想法是:

1) 使用使用阈值并根据广告支付确定其最大大小。 f.e。将使用量设置为支付的美分数额。在所有阈值都为空之后,将它们全部重置。 Afaik 这与 google 为他们的广告系统工作的方式很相似。

2) 用第二个兰特工作。让我们将其与 ech 广告的 vaktor 进行比较,f.e。美分为此付出了代价。仅当第二个兰特大于您使用它的因素时。否则你重复第一个兰特以获得新广告。

就商务而言,第一个应该是要走的路。你甚至可以将两者结合起来。 1) 中的阈值可能是 2) 中第二个兰特的因素)。

Zarthus 最后的建议是正确的做法:

    class AdObject
    {
        private $asset = 0;

        function __construct($asset)
        {
            $this->asset = $asset;
        }

        public function getAsset()
        {
            return $this->asset;
        }

        public function setAsset($asset_input)
        {
            $this->asset = $asset_input;
        }

        public function getScore()
        {
            return ($this->asset *(float)rand()/(float)getrandmax());
        }
    }

    function chooseAdvertising($ads_array)
    {
        $scores_array = array ();

        foreach ($ads_array as $value)
            $scores_array[] = $value->getScore();

        $max_indexes = array_keys($scores_array, max($scores_array));
        return $max_indexes[0];
    }
    $advertisment_arr = array (new AdObject("0.15"), new AdObject("0.20"), new AdObject("0.32"));

我们假定 chooseAdvertising 函数将为您提供要显示的广告的索引,该索引包含在 $advertisment_arr.

您可以自定义函数getScore或AdObject的属性来获得您想要的输出。