Gerekirse php onay sayılar bir dizi belirli bir değere kadar ekler ve eğer artış

4 Cevap php

Bir keresinde bir dakika çalıştırılan bir php komut dosyası var. Komut zaman belirli bir miktar uyur, sonra ikinci bir komut dosyasını çalıştırır.

Şu anda zaman statik. 20 saniye, her zaman.

I so isimli bu uyur süreyi rastgele gerekenler. Bu 60 saniye toplamından daha fazla, ama daha az değil olabilir.

Yani burada ben şimdi ne var.

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

I yapmak için neler gerekir, tüm $ uyku değişkenleri eklemek, ve sonra toplam 60 daha az olduğunu belirlemektir. Eğer durum bu ise, ben fark telafi etmek için değişkenlerin bir veya daha fazla değerini artırmak gerekir.

4 Cevap

Eğer daha, ya da tam 4 $ sleep_ değişkenleri gerekmez daha fazla olması durumunda:

<?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;

?>

Sizin gibi bir şey verir:

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

71

Eğer $ bağlı değilseniz sleep1, ..., $ Uyku4 ama $ uyku [0 ... n] gibi bir şey kullanabilirsiniz:

<?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: Eğer "ölçek" $ uyku değerlerin her biri, 60 (veya daha fazla) Özetle, böylece isterseniz:

<?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";

baskılar mesela

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

Sadece üzerine ekstra çakmak için bir neden var mı $sleep1?

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