2017-03-03 1 views
0

Erster Beitrag, bitte sei sanft.PHP - Wert durch einen kleinen Marktprozentsatz ändern

Ich versuche ein einfaches Markt-Skript zu erstellen, wo ich zum Beispiel eine Nummer in meiner Datenbank habe, dh 50,00 und ich möchte ein Cron-Job-PHP-Skript ausführen, um dieses zufällig auf ein Minimum von 10,00 und ein Maximum zu erhöhen oder zu verringern von 75,00.

dachte ich eine zufällige 0,1 Folge von 2 if-Anweisungen 1 rand(-0.01,0.05) wenn 2 rand(0.01,0.05) dann $sql = "UPDATE price SET oil='RESULT'";

ich ein paar Mal in der oben versucht habe, aber ich kann es nicht und die anderen crons zu laufen bekommen in der Datei arbeiten.

<?php 
//Get Oil Price from database 
$oilchange = rand(1, 2); 
if ($oilchange == '1') { 
    $oilnew = rand(0.01,0.05); 
//Oil price from database times oil new. 

} else { 
    $oilnew = rand(-0.01,-0.05); 
//Oil price from database times oil new. 
} 
// Update Price 
?> 
+1

Haben Sie einen Fehler erhalten? Was geschieht? Bitte fügen Sie Ihren tatsächlichen Code hinzu. – chris85

+0

Normalerweise würden Sie den Wert "schwenken" und dann prüfen, ob er in Reichweite ist. I.e. addiere die Zufallszahl und überprüfe, ob sie unter 10 oder über 75 liegt. Das hängt auch davon ab, wie du reagieren möchtest, wenn dies passiert (sollte es nichts tun, oder an den Grenzen klemmen). –

+0

können Sie den Code kopieren und einfügen, wählen Sie ihn aus und klicken Sie auf die '{}' Taste, die es lesbar formatiert :) – niceman

Antwort

0

Rand ist für ganze Zahlen (ganze Zahlen)

First up, um Ihre Nutzung des Randes zwischen zwei Dezimalwerte (so genannte Floats) wird nicht funktionieren, da rand nur für ganze Zahlen ist. Also, würden Sie zuerst eine Zufallsfunktion haben wollen, die Ausgabe schwimmt der Fall ist, wie folgt aus:

function randomFloat($min = 0, $max = 1) { 
    return $min + mt_rand()/mt_getrandmax() * ($max - $min); 
} 

Dann können wir es sicher verwenden, um zwischen, sagen wir, 1% und 5%:

$percentSwing = randomFloat(0.01, 0.05); 

Rand standardmäßig auf 0 oder 1. Das können wir verwenden zufällig es zu invertieren, so decken wir auch -1% bis -5%:

$percentSwing *= rand() ? 1 : -1; 

Die oben auch so geschrieben werden:

if(rand() == 1){ 
    // Do nothing: 
    $percentSwing *= 1; 
}else{ 
    // Invert it: 
    $percentSwing *= -1; 
} 

Also, wir wissen jetzt, wie viel wir brauchen, um die Zahl um zu schwingen. Sagen wir, es $oilPrice war:

$oilPrice = 48; 

Wir können nur die prozentuale Swing multiplizieren mit dieser Zahl die Menge, um es durch das ändert, dann fügen Sie wieder auf:

$oilPrice += $percentSwing * $oilPrice; 

So weit, so gut! Jetzt müssen wir sicherstellen, dass der Preis nicht außerhalb unseres festen Bereichs von 10 bis 75 liegt. Angenommen, Sie wollen die Zahl "klemmen" - das bedeutet, wenn sie unter 10 liegt, ist sie auf 10 gesetzt und umgekehrt wie folgt aus:

if($oilPrice < 10){ 
    // It went below 10 - clamp it: 
    $oilPrice = 10; 
}else if($oilPrice > 75){ 
    // It went above 75 - clamp it: 
    $oilPrice = 75; 
} 

die oben auch in einer Zeile dargestellt werden kann, wie folgt aus:

$oilPrice = max(10, min(75, $oilPrice)); 

So, das gibt uns die ganze Sache:

function randomFloat($min = 0, $max = 1) { 
    return $min + mt_rand()/mt_getrandmax() * ($max - $min); 
} 

// Define the oil price (e.g. pull from your database): 
$oilPrice = 48; 

// get a random 1% to 5% swing: 
$percentSwing = randomFloat(0.01, 0.05); 

// Invert it 50% of the time: 
$percentSwing *= rand() ? 1 : -1; 

// Swing the price now: 
$oilPrice += $percentSwing * $oilPrice; 

// Clamp it: 
$oilPrice = max(10, min(75, $oilPrice)); 

// Output something! 
echo $oilPrice; 

Als Randbemerkung hier, Geld in realen finanziellen Syste ms wird nie als Gleitkomma gespeichert, weil rounding errors can cause major problems.

+1

danke für deine Hilfe und ausführliche Erklärung. –

Verwandte Themen