【问题标题】:How to randomly generate a number from a range of numbers but exclude some numbers? [duplicate]如何从一系列数字中随机生成一个数字但排除一些数字? [复制]
【发布时间】:2016-06-03 15:40:04
【问题描述】:

如何从 1 到 10 之间的数字范围内生成随机数,同时排除数字数组,例如4,5,6。

$exclude = array(4,5,6);

以下代码允许在一个范围内生成随机数,但仅适用于单个数字,而不是数字数组

function randnumber() {
    do {
    $numb = rand(1,10);
} while ($varr == 4);
return $numb;
}

【问题讨论】:

  • 我能想到至少 20 种方法。你想要它快吗?你关心它的分布有多均匀吗?它可以使用多少内存?你会调用它一次还是数千次?
  • 我只是一个初学者,所以我不是很在意。性能不是问题,也不需要均匀分布。
  • 你能分享你的尝试吗?请阅读how to ask questions on StackOverflow
  • 其实好像这个比较好:stackoverflow.com/questions/2698265/…
  • @Don'tPanic 谢谢。

标签: php


【解决方案1】:

创建一个循环,直到使用 rand 函数生成的随机数不在数组中。如果在数组中找到生成的数字,则再次生成另一个随机数。

do {   
    $number = rand(1,10);
} while(in_array($number, array(4,5,6)));
echo $number;

while(in_array(($number = rand(1,10)), array(4,5,6)));
echo $number;

你也可以像函数一样使用它:

<?php

function randomNo($min,$max,$arr) {
    while(in_array(($number = rand($min,$max)), $arr));
    return $number;
}

echo randomNo(1,10,array(4,5,6));

上面的函数,做同样的过程,此外,你可以重用代码。它获取最小和最大数量以及要排除的值数组。


最后,

没有循环,但有递归函数。该函数生成一个随机数,如果在exclude数组中没有找到则返回:

function randomExclude($min, $max, $exclude = array()) {
    $number = rand($min, $max);
    return in_array($number, $exclude) ? randomExclude($min, $max, $exclude) : $number;
}

echo randomExclude(1,10,array(4,5,6));

【讨论】:

    【解决方案2】:
    <?php
    $exclude = array(4,5,6); // The integers to excluded
    do
    {
       $x = rand(1, 10); // Generate a random integer between 1 and 10
    }while(in_array($x, $exclude)); // If we hit something to exclude, try again
    echo $x; // A random integer not excluded
    ?>
    

    明智的做法是检查是否没有排除所有输入以避免无限循环

    【讨论】:

      【解决方案3】:

      你可以简单地做到这一点,使用这样的数组函数:

      function my_rand($min, $max, array $exclude = array())
      {
           $range = array_diff(range($min, $max), $exclude);
           array_shuffle($range);
      
           return array_shift($range);
      }
      

      【讨论】:

      • 为什么 OP 应该“简单地这样做”? 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,也是为了 SO 的未来访问者。跨度>
      • @JayBlanchard,我认为,在这种情况下,功能逻辑非常简单和透明。我看不出有什么原因,评论这段代码。如果您认为不同,请编辑帖子并添加说明。
      • 正如我之前所说,SO 的未来访问者可能会迷失在您所说的内容上,也许他们是对编码一无所知的新手,而您的回答,就目前而言,不会有帮助给他们。想象一下你编码的最初几天——你的答案对你来说是透明的吗?我会把它留给你来编辑你自己的帖子。
      【解决方案4】:

      前段时间我还想摆脱这些讨厌的小while循环。减少以适合您的问题版本,我的方法是:

      • 首先生成一个在 (10 - 3) 范围内的随机数,以指示要生成的数字在所需范围(不包括 {4,5,6})的假设数字列表中的位置
      • 第二次将此值增加下限 (1)
      • 集合 {4,5,6} 中的每个数字等于或大于它的第三个增量 1(按该集合中从最小到最大的顺序)

      所以,总而言之,我基本上会拉伸和模糊生成的随机值的假设数字集,以适应可能的结果。

      【讨论】:

        【解决方案5】:
        $total = range(0,10);
        $exclude = range(4,6);
        $include = array_diff($total, $exclude);
        print_r (array_rand($include));
        

        【讨论】:

          猜你喜欢
          • 2013-05-20
          • 2011-09-20
          • 1970-01-01
          • 2011-02-18
          • 2017-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多