PHP code optimalisatie

Status
Niet open voor verdere reacties.

5blabla5

Gebruiker
Lid geworden
27 apr 2009
Berichten
485
Goededag,

Om mijn PHP- en rekenskills een beetje bij te houden maak ik af en toe een functie die handig kan zijn. Ik heb vandaag een script gemaakt waarmee de rand() functie op een andere manier gebruikt kan worden:

Stel je voor: je hebt 4 kleuren, blauw, geel, rood en groen. De kans dat de rand() functie bijv. blauw kiest, is 1 op de 4, of 0,25. Je wilt echter dat blauw een drie keer zo grotere kans heeft gekozen te worden. Je kunt er dan voor kiezen om blauw drie keer in een array te zetten, en de andere kleuren één keer, maar deze functie zou dit beter kunnen. In dit geval moet de functie zo worden gebruikt: probability('blauw', 3, 'geel', 1, 'rood', 1, 'groen', 1).

Bij het 1000 keer uitvoeren van de functie is het resultaat:
groen: 16.1%
rood: 16.7%
geel: 17.1%
blauw: 50.1%

Bij deze test hoort de volgende code (inclusief functie):
PHP:
<?php

	#
	# Format:
	# 'change1', 0.8, 'change2', 0.1, 'change3', 0.1
	# So: name1, change1, name2, change2, name3, change3
	#
	# Change is calculated by adding all changes
	# The total of the changes does not need to be 1, 100%
	# or another value
	#
	# Requires PHP 4 or higher
	#

	function probability() {
	
		#########################
		# processing arguments
		#
		# Get number of arguments, and create empty array
		$numargs = func_num_args();
		$content = array();
		#
		# Check if number of args isn't zero
		if($numargs == 0) {
			return FALSE;
		}
		#
		# Check if number of args is equally
		if( ($numargs / 2) != round($numargs / 2) ) {
			return FALSE;
		}
		#
		# Start reading arguments
		for($i = 0; $i < $numargs; $i += 2) {
			$content[func_get_arg($i)] = func_get_arg($i + 1);
		}
		#
		#########################
		
		#########################
		# Making array with changes
		#
		# Determine the total change
		$total = 0;
		foreach($content as $name => $change) {
			$total += $change;
		}
		#
		# Get changes
		$changes = array();
		for($i = 0; $i < $numargs; $i += 2) {
			$changes[func_get_arg($i)] = (func_get_arg($i + 1) / $total);
		}
		#
		# Get total pieces
		$pieces = 1;
		foreach($changes as $change) {
			if( ($change * $pieces) != round( ($change * $pieces) ) ) {
				$pieces = $pieces * 10;
			}
		}
		#
		# Calculate number of pieces per argument
		$piecesperargument = array();
		foreach($changes as $name => $content) {
			$piecesperargument[$name] = $content * $pieces;
		}
		#
		# Create piecefield
		$piecefield = array();
		foreach($piecesperargument as $name => $content) {
			for($i = 0; $i < $content; $i++) {
				$piecefield[] = $name;
			}
		}
		#
		#########################
		
		#########################
		# Picking out a random value
		#
		# Shuffle piecefield
		shuffle($piecefield);
		#
		# Get random number
		$random = mt_rand(0, count($piecefield) - 1);
		#
		# Get return value
		$return = $piecefield[$random];
		#
		# Return value
		return $return;
		#
		#########################
	}
	
	// Check if function works
	
	if(!isset($_GET['number'])) {
		$_GET['number'] = 1000;
	} else {
		$_GET['number'] = (int) $_GET['number'];
	}

	$i = 0;
	while($i < $_GET['number']) {
	
		$result = probability('blauw', 3, 'geel', 1, 'rood', 1, 'groen', 1);
		
		if(isset($count[$result])) {
			$count[$result]++;
		} else {
			$count[$result] = 1;
		}
		
		$i++;
	}
	
	asort($count);
	
	foreach($count as $name => $content) {
	
		echo $name . ': ' . ( ($content / $_GET['number']) * 100 ) . '</br >';
		
	}
	
	
	
?>

Is de code nog op één of andere manier te optimaliseren?
 
$_GET['number']
is in mijn opzicht als niet te gebruiken binnen functie werkt ok
maar een atribuut op je function
function probability($number) {//is beter omdat je sneller naar een andere variabel gaat en ook nog je variabele kan valideren als dit zou moeten.

*aanpassing mijn excuses te snel gereageert
 
Laatst bewerkt:
$_GET['number'] hoort tot een testcode die buiten de functiedefenitie valt, dus het wordt niet in de functie zelf gebruikt. De functie zelf is voor één maal uitvoeren, en de testcode voert het bijvoorbeeld duizend keer uit. Verder is het bij deze functie niet handig om één of meerdere argumenten vast te leggen en te verplichten, aangezien er in principe oneindig veel argumenten toegevoegd moeten kunnen worden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan