發新話題
打印

[源碼交流] Rand代碼 - 在取得隨機值中盡量保持公平性

本主題由 admin 於 2007-12-5 19:35 移動 -

[源碼交流] Rand代碼 - 在取得隨機值中盡量保持公平性

通常的取得隨機代碼 大概都是 rand(0, 100) < 25 這種類型的
但是 這樣雖的確是隨機 可是總感覺 洗牌的成分不夠多
所以 我弄了以下的代碼
原理是 先建立陣列然後將她洗牌後
取得 隨機基準值 跟 要進行判斷的隨機值
然後 在隨機選擇 比較方式
&lt;%

// 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'] &gt;= $r['n3']) ? 1 : 0) : (($r['n4'] &lt;= $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'] &gt;= $r['n3']) ? 1 : 0) : (($r['n4'] &lt;= $r['n3']) ? 1 : 0);
	}
	
	return $r['r'];
}

foreach (array(0, 10, 25, 30, 50) as $m) {
	
	$tt1 = 0;
	$tt2 = 0;
	
	echo &quot;\n倍率: $m\n&quot;;
	
	for ($j=0; $j&lt;=10; $j++) {
		$t = array();
		
		$t['m'] = $m;
		$t['j'] = $j;
		
		$t[0] = array(0 =&gt; 0, 1 =&gt; 0, 2 =&gt; 0);
		$t[1] = array(0 =&gt; 0, 1 =&gt; 0, 2 =&gt; 0);
		
		for ($i=0; $i&lt;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 &quot;\n\t級數: $j 中獎率 1: $t[t1]%&quot;;
		echo &quot;\n\t級數: $j 中獎率 2: $t[t2]%&quot;;
	}
	
	echo &quot;\n\n\t平均中獎率 1: &quot;.($tt1 / $j).&quot;%\n\t平均中獎率 2: &quot;.($tt2 / $j).&quot;%\n&quot;;
}

?&gt;
複製內容到剪貼板
代碼:
倍率: 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%
套一句黃小琥說過的話:「你可以點歌,但是我可以選歌」

TOP

發新話題