如何让一些随机数比其他随机数出现得更多?
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的属性来获得您想要的输出。
我正在尝试托管我自己的广告。例如,我希望出价高达 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的属性来获得您想要的输出。