【问题标题】:Generate random number again if it doesn't equal x如果不等于 x,则再次生成随机数
【发布时间】:2014-03-02 11:11:42
【问题描述】:

我想生成一个介于 1 和 100 之间的数字,但我希望它继续重新生成该数字直到等于 50,一旦等于 50,然后将其回显。我该怎么做?

我的功能:

function create() {
    $production_line = mt_rand(0, 3);
    $random1 = mt_rand(0, 9);
    $random2 = mt_rand(0, 9);
    $random3 = mt_rand(0, 9);
    $random4 = mt_rand(0, 9);
    $random5 = mt_rand(0, 9);
    $random6 = mt_rand(0, 9);
    $production_year = mt_rand(3, 4);
    $week1 = 4;
    $week2 = 8;
    $factory1 = 4;
    $factory2 = 8;

    if ($production_line + $random1 + $random2 + $random3 + $random4 + $random5 + $random6 + $production_year + $week1 + $week2 + $factory1 + $factory2 == 55) {
        return $production_line.$random1.$random2.$random3.$random4.$random5.$random6.$production_year.$week1.$week2.$factory1.$factory2;
    }
}

【问题讨论】:

  • 使用while 循环,有什么问题?但有什么意义呢?只需打印 50 个。
  • 我只是用了示例数字,它真正能产生的数字量太大了
  • 我不知道生成随机 nu 有什么用。并再次检查修复变量..这可能是一个性能问题,浪费时间就是这样..cn你请解释一下你的真正需要吗??
  • 我喜欢这些作业
  • @Barmar,这是一个很好的观点;)

标签: php random


【解决方案1】:

使用简单的循环:

$i = 0;
while ($rand = mt_rand(0,100)) {
    $i++;
    if ($rand == 50) {
        // found 50, so break out of the loop
        break;
    }
}

echo "It took $i iterations to find 50";

但这有点没有意义,对吧?如果你只是想一直输出50,那你为什么需要生成一个随机数呢?只需回显50。另请注意,如果更大的限制是一个更大的数字,这可能是一个缓慢的操作。

【讨论】:

  • 此外,您可能还想保留一个计数器。在远程时,您可能会在达到“随机”50 之前进行数千次迭代。对服务器来说不是很好。
  • @MueR:更新了答案。
  • 有用,但如果一千次迭代没有导致 50 次,我会中止循环。
  • @MueR:这非常不太可能。正如答案中已经提到的,对于较大的数字,这可能会变得非常慢,所以我真的不建议这样做。可以中止,但这只是 OP 指示如何继续。
  • 我同意机会渺茫,但随机数生成,你永远不知道。安全总比后悔好,尤其是当它引起本地服务器管理员的愤怒时:P
【解决方案2】:

while 循环中生成并测试所有随机数。

function create() {
    $week1 = 4;
    $week2 = 8;
    $factory1 = 4;
    $factory2 = 8;
    while (true) {
        $production_line = mt_rand(0, 3);
        $random1 = mt_rand(0, 9);
        $random2 = mt_rand(0, 9);
        $random3 = mt_rand(0, 9);
        $random4 = mt_rand(0, 9);
        $random5 = mt_rand(0, 9);
        $random6 = mt_rand(0, 9);
        $production_year = mt_rand(3, 4);

        if ($production_line + $random1 + $random2 + $random3 + $random4 + $random5 + $random6 + $production_year + $week1 + $week2 + $factory1 + $factory2 == 55) {
            return $production_line.$random1.$random2.$random3.$random4.$random5.$random6.$production_year.$week1.$week2.$factory1.$factory2;
        }
    }
}

【讨论】:

  • 就是这样,谢谢,有什么办法可以加快速度吗?如果没有也没关系。这不用于生产目的。仅用于学习目的。
【解决方案3】:

我重新排列了一些代码以使其更具凝聚力:

function create() {
    do {
        $arr = [
            mt_rand(0, 3), // line
            mt_rand(0, 9), 
            mt_rand(0, 9),
            mt_rand(0, 9),
            mt_rand(0, 9),
            mt_rand(0, 9),
            mt_rand(0, 9),
            mt_rand(3, 4), // year
            4, // weeks
            8,
            4, // factories
            8,
        ];
    } while (array_sum($arr) != 55);

    return join('', $arr);
}

【讨论】:

    【解决方案4】:
    $number = 0;
    $try = 0;
    
    while ($number != 50) {
      $try++;
      $number = rand(1,100);
    }
    
    echo "found $number after $try cycles";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-30
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2013-10-24
      • 2014-01-11
      • 2016-03-10
      相关资源
      最近更新 更多