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):
Is de code nog op één of andere manier te optimaliseren?
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?