一道算法题

 
 已知一个函数f可以等概率的得到1-5间的随机数,问怎么等概率的得到1-7的随机数。 

----

连续调用函数f两次,就能得到5*5=25种可能的组合串;抛弃最后的四个组合串,就有21中可能性,正好是7的倍数。

php的简陋实现如下:

<?php

function rand5to7 ($p)
{
    switch ($p) {
        case '11':    
        case '12':    
        case '13':
            return 1;
            break;
        case '14':    
        case '15':    
        case '21':
            return 2;
            break;    
        case '22':    
        case '23':    
        case '24':
            return 3;
            break;    
        case '25':    
        case '31':    
        case '32':    
            return 4;
            break;    
        case '33':    
        case '34':    
        case '35':    
            return 5;
            break;    
        case '41':    
        case '42':    
        case '43':    
            return 6;
            break;    
        case '44':    
        case '45':    
        case '51':    
            return 7;
            break;    
        case '52':    
        case '53':    
        case '54':    
        case '55':    
            return false;
            break;    
    }
}

function rand7 () {
    while (true) {
        $a = rand(1, 5);
        $b = rand(1, 5);
        $random = rand5to7($a.$b."");
        if ($random) {
            return $random;
            break;
        }
    }
}

$array = array();

$i = 700000;
while ($i -- > 0) {
    $ext = rand7();
    $array["key$ext"] ++;
}

ksort($array);
echo print_r($array);

结果:

vxx:~/jeff # php c.php 
Array
(
    [key1] => 100257
    [key2] => 99922
    [key3] => 99595
    [key4] => 100063
    [key5] => 100088
    [key6] => 100194
    [key7] => 99881
)

  

 

posted @ 2013-06-10 16:51  stallman  阅读(180)  评论(0编辑  收藏  举报