生成随机数

1、可预测的随机数
function pick_color(){
$colors = array('red','orange','yellow','blue','green','indigo','violet');
$i = mt_rand(0,count($colors)-1);
return $colors[$i];
}
mt_srand(11);
$first = pick_color();
$second = pick_color();

print "$first is red and $second is yellow.";

2、生成偏随机数
// 定义一个名为rand_weighted的函数,它接受一个关联数组作为参数
function rand_weighted($numbers){
$total = 0; // 初始化一个变量来存储所有权重的总和
foreach($numbers as $number => $weight){ // 遍历传入的数组
$total += $weight; // 将当前元素的权重加到总和中
$distribution[$number] = $total; // 创建一个新的数组,其键为广告商名称,值为从0到当前权重总和的累积值
}
$rand = mt_rand(0, $total - 1); // 生成一个0到总权重减1之间的随机数
foreach($distribution as $number => $weights){ // 遍历上一步创建的累积权重数组
if($rand < $weights){ // 如果随机数小于当前广告商的累积权重
return $number; // 返回当前广告商的名称
}
}
// 注意:由于逻辑上,上述循环一定会找到并返回一个广告商名称,因此这里实际上不需要return语句或任何其他语句
}

// 定义一个包含广告商及其权重的数组
$ads = array('ford' => 12234, // 福特汽车,权重为12234
'att' => 33424, // 美国电话电报公司,权重为33424
'ibm' => 16823); // 国际商业机器公司,权重为16823

$ad = rand_weighted($ads); // 调用rand_weighted函数,传入广告商数组,并将返回的广告商名称存储在$ad变量中

print $ad; // 打印随机选择的广告商名称

3、使用生成器函数
// 定义一个生成器函数,它接受一个数组并逐个累加数组中的值,同时产出键和累加的总和
function incremental_total($numbers){
$total = 0; // 初始化累加器
foreach($numbers as $number => $weight){ // 遍历数组
$total += $weight; // 累加当前元素的值
yield $number => $total; // 产出当前键和累加的总和
}
}

// 定义一个函数,它接受一个数组,根据权重随机选择一个键,并返回该键
function rand_weighted_generator($numbers){
$total = array_sum($numbers); // 计算数组中所有值的总和
$rand = mt_rand(0, $total - 1); // 生成一个0到总和减1之间的随机数
print "$rand"; // 打印随机数(调试用)
print '
'; // 打印换行符

foreach(incremental_total($numbers) as $number => $weight){ // 遍历生成器产出的结果
    print "$number".'--->'."$weight"; // 打印当前键和累加的总和(调试用)
    print '<br />'; // 打印换行符

    if($rand < $weight){ // 如果随机数小于当前累加的总和
        return $number; // 返回当前键(即随机选择的键)
    }
}
// 注意:由于逻辑上,上述循环一定会找到并返回一个键,因此这里不需要额外的return语句
// 但实际上,如果数组为空或存在其他异常情况,这里可能需要处理或抛出异常

}

// 定义一个包含广告商及其权重的数组
$ads = array('ford' => 12234,
'att' => 33424,
'ibm' => 16823);

$ad = rand_weighted_generator($ads); // 调用函数并尝试获取随机选择的广告商

print $ad; // 打印随机选择的广告商(这里实际上会正常工作,因为函数会返回一个值)

posted @   kksllss  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
点击右上角即可分享
微信分享提示