2009-07-13 4 views
0

J'ai un script PHP qui s'exécute une fois par minute. Le script exécute un deuxième script, puis dort pendant un certain temps.Vérifiez si une série de nombres correspond à une valeur définie et augmentez-la si nécessaire.

À l'heure actuelle, l'heure est statique. 20 secondes à chaque fois.

Ce dont j'ai besoin est de randomiser la quantité de temps qu'il dort. Cela peut prendre plus de 60 secondes au total, mais pas moins.

Alors voici ce que j'ai maintenant.

$sleep1 = rand(2,18); 
$sleep2 = rand(2,18); 
$sleep3 = rand(2,18); 
$sleep4 = rand(2,18); 
if $sleep1 + $sleep2 + $sleep3 + $sleep4 <= 60 ? 

je dois ajouter toutes les variables $sleep, puis déterminer si le total est inférieur à 60. Dans ce cas, je dois augmenter la valeur d'un ou plusieurs des variables pour compenser la différence . Pourquoi ne pas passer cette valeur à rand()?

Répondre

1

Si vous pouvez avoir plus, ou ne pas besoin exactement 4 variables de $:

<?php 

$time = 0; 
$i = 1; 
$array = array(); 

do { 
    $sleep{$i} = rand(2,18); 
    $array[] = $sleep{$i}; 
    $time += $sleep{$i}; 
    $i++; 
} while ($time <= 60); 

print_r($array); 

echo $time; 

?> 

vous donne quelque chose comme:

Array 
(
    [0] => 5 
    [1] => 2 
    [2] => 18 
    [3] => 9 
    [4] => 11 
    [5] => 10 
    [6] => 3 
    [7] => 13 
) 

71 
4

Pourquoi ne pas passer cette valeur à rand()?

sleep(rand(60, 120)); 

Si vous avez vraiment besoin de votre méthode, il suffit d'utiliser max():

sleep(max(60, $sleep1 + $sleep2 + $sleep3 + $sleep4)); 
2

Si vous n'êtes pas lié à $ sleep1, ..., $ sleep4 mais peut utiliser quelque chose comme $ sleep [0 ... n]:

<?php 
$threshold = 60; 

$sleep = array(); 
$sleep[] = rand(2,18); 
$sleep[] = rand(2,18); 
$sleep[] = rand(2,18); 
$sleep[] = rand(2,18); 

if (array_sum($sleep) < $threshold) { 
    $sleep['padding'] = $threshold - array_sum($sleep); 
} 

foreach($sleep as $i=>$value) { 
    echo $i, ': ', $value, "\n"; 
} 

edit: si vous voulez "échelle" chacun des $ sommeil valeurs pour que leur somme jusqu'à 60 (ou plus):

<?php 
$threshold = 60; 

$sleep = array(); 
$sleep[] = rand(2,18); 
$sleep[] = rand(2,18); 
$sleep[] = rand(2,18); 
$sleep[] = rand(2,18); 

echo 'before: ', join(',', $sleep), '=', array_sum($sleep), "\n"; 
$sum = array_sum($sleep); 
if ($sum < $threshold) { 
    $add = (int)(($threshold-$sum)/count($sleep)); 
    $remainder = $threshold - ($sum+$add*count($sleep)); 
    foreach($sleep as &$v) { 
    $v += (int)$add; 
    if ($remainder-- > 0) { 
     $v += 1; 
    } 
    } 
} 

echo 'after: ', join(',', $sleep), '=', array_sum($sleep), "\n"; 

impressions par ex.

before: 2,13,12,15=42 
after: 7,18,16,19=60 

before: 10,9,3,12=34 
after: 17,16,9,18=60 

before: 14,17,16,15=62 
after: 14,17,16,15=62 
1

Y a-t-il une raison pour ne pas coller le surplus sur $sleep1?

if (($sleep1 + $sleep2 + $sleep3 + $sleep4) <= 60) { 
    $sleep1 += 61 - ($sleep1 + $sleep2 + $sleep3 + $sleep4); 
} 
Questions connexes