通常的取得隨機代碼 大概都是
rand(0, 100) < 25 這種類型的
但是 這樣雖的確是隨機 可是總感覺 洗牌的成分不夠多
所以 我弄了以下的代碼
原理是 先建立陣列然後將她洗牌後
取得 隨機基準值 跟 要進行判斷的隨機值
然後 在隨機選擇 比較方式
<%
// copyright by bluelovers - <a href="http://discuz.bluelovers.net/" target="_blank">http://discuz.bluelovers.net/</a>
function randsc ($ra = 0, $rb = 0, $low = 1, $high = 100, $step = 1) {
srand((float)microtime() * 1000000 * rand());
$r = array();
$r['a'] = range($low, $high, $step);
$r['n1'] = rand($low-1, $high);
$r['n2'] = rand($low-1, $high);
$r['c'] = rand(0, 1+$rb);
shuffle($r['a']);
$r['n3'] = $r['a'][$r['n1']];
if ($r['n4'] == $r['n3'] || $ra == $r['n3']) {
$r['r'] = 2;
} else {
$r['n4'] = $ra ? $ra : $r['a'][$r['n2']];
$r['r'] = $r['c'] ? (($r['n4'] >= $r['n3']) ? 1 : 0) : (($r['n4'] <= $r['n3']) ? 1 : 0);
}
return $r['r'];
}
function mt_randsc ($ra = 0, $rb = 0, $low = 1, $high = 100, $step = 1) {
mt_srand((float)microtime() * 1000000 * mt_rand());
$r = array();
$r['a'] = range($low, $high, $step);
$r['n1'] = mt_rand($low-1, $high);
$r['n2'] = mt_rand($low-1, $high);
$r['c'] = mt_rand(0, 1+$rb);
shuffle($r['a']);
$r['n3'] = $r['a'][$r['n1']];
if ($r['n4'] == $r['n3'] || $ra == $r['n3']) {
$r['r'] = 2;
} else {
$r['n4'] = $ra ? $ra : $r['a'][$r['n2']];
$r['r'] = $r['c'] ? (($r['n4'] >= $r['n3']) ? 1 : 0) : (($r['n4'] <= $r['n3']) ? 1 : 0);
}
return $r['r'];
}
foreach (array(0, 10, 25, 30, 50) as $m) {
$tt1 = 0;
$tt2 = 0;
echo "\n倍率: $m\n";
for ($j=0; $j<=10; $j++) {
$t = array();
$t['m'] = $m;
$t['j'] = $j;
$t[0] = array(0 => 0, 1 => 0, 2 => 0);
$t[1] = array(0 => 0, 1 => 0, 2 => 0);
for ($i=0; $i<100; $i++) {
$r1 = randsc($m, $j);
$r2 = mt_randsc($m, $j);
$t[0][$r1]++;
$t[1][$r2]++;
}
$t['t1'] = $t[0][1] + $t[0][2];
$t['t2'] = $t[1][1] + $t[1][2];
$tt1 += $t['t1'];
$tt2 += $t['t2'];
echo "\n\t級數: $j 中獎率 1: $t[t1]%";
echo "\n\t級數: $j 中獎率 2: $t[t2]%";
}
echo "\n\n\t平均中獎率 1: ".($tt1 / $j)."%\n\t平均中獎率 2: ".($tt2 / $j)."%\n";
}
?>複製內容到剪貼板
代碼:
倍率: 0
級數: 0 中獎率 1: 48%
級數: 0 中獎率 2: 55%
級數: 1 中獎率 1: 57%
級數: 1 中獎率 2: 46%
級數: 2 中獎率 1: 49%
級數: 2 中獎率 2: 64%
級數: 3 中獎率 1: 43%
級數: 3 中獎率 2: 41%
級數: 4 中獎率 1: 58%
級數: 4 中獎率 2: 52%
級數: 5 中獎率 1: 50%
級數: 5 中獎率 2: 50%
級數: 6 中獎率 1: 47%
級數: 6 中獎率 2: 47%
級數: 7 中獎率 1: 49%
級數: 7 中獎率 2: 62%
級數: 8 中獎率 1: 41%
級數: 8 中獎率 2: 47%
級數: 9 中獎率 1: 44%
級數: 9 中獎率 2: 45%
級數: 10 中獎率 1: 51%
級數: 10 中獎率 2: 49%
平均中獎率 1: 48.818181818182%
平均中獎率 2: 50.727272727273%
倍率: 10
級數: 0 中獎率 1: 52%
級數: 0 中獎率 2: 54%
級數: 1 中獎率 1: 35%
級數: 1 中獎率 2: 31%
級數: 2 中獎率 1: 30%
級數: 2 中獎率 2: 33%
級數: 3 中獎率 1: 28%
級數: 3 中獎率 2: 34%
級數: 4 中獎率 1: 27%
級數: 4 中獎率 2: 24%
級數: 5 中獎率 1: 22%
級數: 5 中獎率 2: 22%
級數: 6 中獎率 1: 21%
級數: 6 中獎率 2: 22%
級數: 7 中獎率 1: 13%
級數: 7 中獎率 2: 27%
級數: 8 中獎率 1: 17%
級數: 8 中獎率 2: 9%
級數: 9 中獎率 1: 20%
級數: 9 中獎率 2: 25%
級數: 10 中獎率 1: 19%
級數: 10 中獎率 2: 14%
平均中獎率 1: 25.818181818182%
平均中獎率 2: 26.818181818182%
倍率: 25
級數: 0 中獎率 1: 52%
級數: 0 中獎率 2: 51%
級數: 1 中獎率 1: 38%
級數: 1 中獎率 2: 33%
級數: 2 中獎率 1: 35%
級數: 2 中獎率 2: 42%
級數: 3 中獎率 1: 27%
級數: 3 中獎率 2: 35%
級數: 4 中獎率 1: 36%
級數: 4 中獎率 2: 27%
級數: 5 中獎率 1: 40%
級數: 5 中獎率 2: 22%
級數: 6 中獎率 1: 36%
級數: 6 中獎率 2: 24%
級數: 7 中獎率 1: 29%
級數: 7 中獎率 2: 41%
級數: 8 中獎率 1: 28%
級數: 8 中獎率 2: 32%
級數: 9 中獎率 1: 23%
級數: 9 中獎率 2: 29%
級數: 10 中獎率 1: 31%
級數: 10 中獎率 2: 25%
平均中獎率 1: 34.090909090909%
平均中獎率 2: 32.818181818182%
倍率: 30
級數: 0 中獎率 1: 57%
級數: 0 中獎率 2: 53%
級數: 1 中獎率 1: 48%
級數: 1 中獎率 2: 43%
級數: 2 中獎率 1: 36%
級數: 2 中獎率 2: 42%
級數: 3 中獎率 1: 47%
級數: 3 中獎率 2: 38%
級數: 4 中獎率 1: 44%
級數: 4 中獎率 2: 36%
級數: 5 中獎率 1: 46%
級數: 5 中獎率 2: 46%
級數: 6 中獎率 1: 38%
級數: 6 中獎率 2: 32%
級數: 7 中獎率 1: 36%
級數: 7 中獎率 2: 37%
級數: 8 中獎率 1: 29%
級數: 8 中獎率 2: 37%
級數: 9 中獎率 1: 39%
級數: 9 中獎率 2: 33%
級數: 10 中獎率 1: 37%
級數: 10 中獎率 2: 35%
平均中獎率 1: 41.545454545455%
平均中獎率 2: 39.272727272727%
倍率: 50
級數: 0 中獎率 1: 49%
級數: 0 中獎率 2: 54%
級數: 1 中獎率 1: 47%
級數: 1 中獎率 2: 43%
級數: 2 中獎率 1: 55%
級數: 2 中獎率 2: 48%
級數: 3 中獎率 1: 50%
級數: 3 中獎率 2: 40%
級數: 4 中獎率 1: 54%
級數: 4 中獎率 2: 52%
級數: 5 中獎率 1: 55%
級數: 5 中獎率 2: 52%
級數: 6 中獎率 1: 54%
級數: 6 中獎率 2: 50%
級數: 7 中獎率 1: 47%
級數: 7 中獎率 2: 47%
級數: 8 中獎率 1: 45%
級數: 8 中獎率 2: 66%
級數: 9 中獎率 1: 58%
級數: 9 中獎率 2: 57%
級數: 10 中獎率 1: 48%
級數: 10 中獎率 2: 60%
平均中獎率 1: 51.090909090909%
平均中獎率 2: 51.727272727273%