PHP根据概率产生随机数

假设 有四个选项:a 占 10%,b占20% ,C占30% , d 占 40% ,原理就是现获取随机数,然后找区间。
当然了,选项的数量可以任意。目前默认是 总和是 100% 。如果需要别的数,修改 随机数的范围即可。
这个算法,比较简单,效率也还算高。

$data = array(
    ‘a‘ => 10 ,
    ‘b‘ => 20 ,
    ‘c‘ => 30 ,
    ‘d‘ => 40
);
echo randomSelect( $data ); 

function randomSelect( &$array ){
    $datas = $array ;
    if( !is_array($datas) || count($datas) == 0 )
        return ;
    asort($datas); //按照大小排序
    $random = rand(1,100);
    $sum = 0 ;

    $flag = ‘‘;
    foreach($datas as $key => $data ){
        $sum += $data ;
        if( $random <= $sum ){
            $flag = $key;
            break ;
        }
    }
    if( $flag == ‘‘ ){ // 如果传递进来的值的和小于100 ,则取概率最大的。
        $keys = array_keys($datas);
        $flag = $keys[count($keys) - 1] ;
    }
    return $flag;
}
时间: 2024-10-06 17:32:39

PHP根据概率产生随机数的相关文章

一天一道算法题—2015-10-22(等概率的随机数)

参考文章:http://blog.csdn.net/a83610312/article/details/11864265http://www.cnblogs.com/dwdxdy/archive/2012/07/28/2613135.html 刚刚笔试完滴滴的题目,有一道题叫做,用一枚硬币随机生成1~3的随机数??如果硬币不准,该怎么办? 想起一道类似的,叫做: 如果函数random(5)可以等概率的生成1~5之间的随机数,请用random(5)生成random(7). !!!原来是智力题,看来

【功能实现】实现设置概率的随机数

1.故事背景 生成一个随机红包,红包的数值0.1元-100元不等,其具体概率为:0.1元为最小单位,0.1元到0.5元的概率为40%,0.5元到1元的概率为50%,1元-2元的概率为5%,2元-3元的概率为3%,3元-4元的概率为1%,4元-5元概率为0.99%,5元-100元的概率为0.01%. 2.思考过程 其实问题很简单,把概率放到一条线段上,我们先把问题简单化,假设随机生成0的概率是40%, 生成1的概率是50%,生成2的概率为5%,生成3的概率是3%...,线段上的0.4/0.9/0.

【watcher】 #02 c# 中实现时间戳等,日期数字及大概率绝对随机数 实现

在Wacher的项目中,用到了很多时间记录的地方,为了将来能够和在线数据打通,我们使用了时间戳来记录时间信息 由于c# 没有现成的方法,所以我们重新写了一个Helper类来帮助我们使用这些公共函数 同时由于是静态函数,添加引用后我们便可以全局调用了. 1.通过日期获取当前的时间戳 这个时间戳是10位的时间戳,如果需要和JAVA兼容请在除法中取出3位,保存到毫秒级 /// <summary> /// 获取时间戳 /// </summary> /// <returns>&l

【Java】揭秘如何利用不等概率随机数制作十赌九骗的赌大小游戏,请不要沉迷各种游戏

上次在<[Java]在一定的范围内产生不同的随机数>(点击打开链接)中说明了如何产生随机数,然后还说了如何在一定的范围内产生不同的随机数,但是这些都是等概率产生随机的问题.等概率在正常情况下,更应该说是学术上是够用了,但是在现实生活中,尤其在现在游戏必须打黄赌毒的擦边球吸引人的大背景下,等概率产生随机数是远远不够用的.你作为游戏商家,说得难听点就是庄家,肯定要不等概率产生随机数来圈玩家的钱.比如,合成装备就你就不能让它合成成功是50%,合成不成功是50%,你必须把合成成功设置为1%甚至更小.这

10,随机等概率的输出m个不重复的数

今天看到一段代码,可以从0.....n-1中随机等概率的输出m个不重复的数(n远远大于m).遂记录下来. 首先,产生随机数,不免要用到srand,rand函数.先简单介绍下两个函数. 1,void srand(unsigned int seed):  初始化随机数生成器,对于每一个不同的seed,每一次调用rand()将会产生不同的随机数序列. 特别的,当seed == 1时,生成器将会被重新初始化以前的初始化值,那么下次rand产生的随机数将会和第一次rand()相同. 所以,为了产生真正的随

等概率随机采样问题

1. 输入包含两个整数m和n,其中m<n.输出[0,n-1]内的m个随机数,要求:每个数选择出现的概率相等(也就是m/n),且按序输出. 依次考虑整数0,1,2,...,n-1,并通过一个适当的随机测试对每个整数进行选择.通过按序访问整数,可以保证输出结果是有序的. if m=2 and n=5,那么选择的每一个数字的概率都应该是2/5. 分析过程:在0,1,2,3,4这五个数字中 第一次遇到0时,它的选择概率应该是2/5,如果选中了,我们开始测试第二个数1,这个时候因为1选中了,所以1这个数字

随机数 验证码问题

一.前言  在日常工作当中,经常会有需要获取随机数.随机字符的需求,如:生成随机数验证码.生成随机字符串签名.生成2个数字之间的随机数等.这些场景其根本都在于随机数的生成,本文将对java当中生成随机数.随机字符等常见应用场景及获取方法进行简单小结. 二.伪随机.真随机数简介   计算机很难产生真正意义上的真随机数,通常我们所说的产生随机数,都是指伪随机数.从一定意义上来说,计算机本身几乎是不可能产生真正意义上的真随机数的,因为其一定是按照一定的运算规则来获取随机数的:当然,伪随机数的伪并不是说

生产随机数

package randomT; import java.util.HashMap;import java.util.Map;import java.util.Random; public class TestMathRandom { //方法名称 String method_Name; //Test public static void main(String[] args) { new TestMathRandom().test(); } private void test() { int

[JS]Math.random()

参考网址:http://www.soulteary.com/2014/07/05/js-math-random-trick.html [JS]Math.random()的二三事 看到题目,如果大家平时被问到:如何生成一个怎么样怎么样的整数随机数,估计大家都会不屑,但是当你淡定的回答获取一个范围应该是随机数seeds和区间数值差的乘机与最小数相加然后再怎么怎么的时候-有没有发现你的思维已经固化了呢. 这个知识点应该是玩JS肯定会碰到的之一吧.文末有Markdown,可以直接下载阅读,清爽一点. 先