在 PHP 中使用数组实现不重复的随机数

2024-04-22

我正在尝试用 PHP 创建一个随机数生成器。它应该一次生成三 (3) 个数字,不重复。也就是说,这3个数字不能相同。

到目前为止,这是我尝试过的:

$array = [];

$A = mt_rand(1,36);
$array[0] = $A;

$B = mt_rand(1,36);
$array[1] = $B;

if(in_array($B,$array)){
    $B = mt_rand(1,36);
    $array[1] = $B;
}

$C = mt_rand(1,36);
$array[2] = $C;

if(in_array($C,$array)){
    $C = mt_rand(1,36);
    $array[2] = $C;
}

$length = count($array);

//display the array values;

for($i = 0; $i < $length; $i++){
    echo ($array[$i]."<br>");
}

谁能告诉我哪里错了?


像这样(根据我最初的评论),

$array = [];

while( count($array) < 3 ){
    $rand = mt_rand(1,36);
    $array[$rand] = $rand;
}

print_r( $array );

通过将“键”设置为随机数,我们可以滥用关联数组键是唯一的这一事实。然后,只需等待数组包含所需数量的唯一项目即可。

你可以测试一下here http://sandbox.onlinephpfunctions.com/code/0fd9dbd408cf81bbde381e7e42427c85e2e7cd19

输出:(你的结果可能会有所不同,它是随机的)

Array
(
    [16] => 16
    [20] => 20
    [27] => 27
)

UPDATE我试图想出一种不使用循环的有效方法(在下班回家的路上),这种方法在某些情况下可能会更好。

$a = range(1,36);

shuffle($a);

$array = array_slice($a, 0, 3);

print_r($array);

当您必须查找的项目数量较多时,这将具有更好的性能。这是因为没有重复,没有冲突。因此,如果您的范围较小,但需要查找许多商品进行退货,那么这样做效果会更好。如果您有很多项目并且只需要返回很少的项目,那么第一个可能会更好,如果不是从速度方面考虑,那么从内存使用方面考虑。

你可以看到here http://sandbox.onlinephpfunctions.com/code/5696894c975c4ba33be2dbac226cf4ab051ae9e1

作为参考,这使用

range() - 创建一个包含一系列元素的数组。

http://php.net/manual/en/function.range.php http://php.net/manual/en/function.range.php

shuffle() - 随机排列(随机化元素的顺序)数组。它使用不适合加密目的的伪随机数生成器。

http://php.net/manual/en/function.shuffle.php http://php.net/manual/en/function.shuffle.php

array_slice() - 返回由 offset 和 length 参数指定的数组中的元素序列。

http://php.net/manual/en/function.array-slice.php http://php.net/manual/en/function.array-slice.php

所以解释一下最后一个

  • 首先,我们创建一个数组,其中包含每个可能的数字作为元素。例如这样[1,2,3,4,5,6, ...].
  • 接下来我们对其进行洗牌,从而随机化整个数组的顺序。 Shuffle 通过“引用”修改数组,因此它不会返回我们的数组,因此没有赋值(我认为它返回布尔值,但是我不知道它如何失败并返回 false,几乎它只是返回 true,我们不想用 ) 覆盖我们的数组。所以我们的例子就变成了这样[16,20,27,14,5,1, ...]
  • 最后,我们削减了需要退回的物品数量。最后我们以此结束这个例子[16,20,27];

您可以通过分配$rand循环条件中的变量。像这样:

$array = [];

while( count($array) < 3 && false !== ($rand = mt_rand(1,36))) $array[$rand] = $rand;

Because mt_rand(1,36)永远不会返回 boolan false。如果我还记得的话mt_rand是相同的rand现在,或者至少在当前的 PHP 版本中。

注意:从 PHP 7.1.0 开始,rand() 使用与 mt_rand() 相同的随机数生成器。为了保持向后兼容性,rand() 允许 max 小于 min,而不是像 mt_rand() 返回 FALSE。http://php.net/manual/en/function.rand.php http://php.net/manual/en/function.rand.php

希望对你有帮助,记得跳出框框思考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP 中使用数组实现不重复的随机数 的相关文章

随机推荐

  • PostgreSQL 9.3:数据透视表查询

    我想显示下表的数据透视表 交叉表 Table Employee CREATE TABLE Employee Employee Number varchar 10 Employee Role varchar 50 Group Name var
  • phonegap 文档中出现的 EDGE api 是什么?

    我正在查看phonegap api 文档 我碰到EDGE在版本下拉列表中 我用谷歌搜索了常规phonegap版本api和EDGE 但却找不到什么强力的东西 有人可以告诉我这件事吗 Edge 应该是最新版本 下一个版本正在进行的工作
  • JQuery - 显示错误和正确的验证图标

    我有一个表单和 JQuery 验证 一切正常 我不想显示消息 而是想显示图标 错误的图标可以正常工作 但我在使用正确的图标时遇到了一些问题 当输入格式正确时 我看到class valid 在语法中
  • 从 IntelliJ 调试 Grails 应用程序

    我一直在努力从 IntelliJ 内部调试 Grails 2 5 0 应用程序 具体来说 我发现很难配置该应用程序 以便 功能测试可调试 可以运行功能测试 该应用程序可以调试 该应用程序可以运行 当 1 和 2 从 IntelliJ 版本
  • pandas 相当于 R dcast

    我有一些这样的数据 import pandas as pd df pd DataFrame index range 1 13 columns school year metric values df school id1 6 id2 6 d
  • Angular 4 抛出 Cannot match any paths 错误与 URL 中的 XSS 脚本

    我正在 Angular 4 中开发一个应用程序 当我尝试为功能模块编写路由时 出现错误 Error Cannot match any routes 这是我使用的路线代码 const COURSE ROUTES Routes path red
  • Gradle 无法确定“14.0.1”中的 Java 版本

    当我尝试在 Gradle 上构建时出现以下错误 FAILURE Build failed with an exception What went wrong Could not determine java version from 14
  • C 中链表的插入排序?

    我尝试寻找与我类似的问题 但没有找到太多帮助 我有一个此类结构的链接列表 struct PCB struct PCB next int reg1 reg2 我首先创建 10 个 PCB 结构 以这种方式链接在一起 for i 20 i lt
  • 针对特定类中的特定类型的自定义 Jackson 序列化器

    Jackson 有没有一种方法允许仅在特定类中对特定类型进行自定义序列化 这是我的场景 我有 ClassA java 类似于 public Class ClassA byte token String name public getToke
  • 如何使用非类型化语言中的 Reader Monad 在整个组合中隐式地线程化参数?

    我知道裸读者单子仅包含两个功能 const chain g gt f gt x gt f g x x const of x gt gt x 但我对它如何工作或如何应用没有任何直觉 知道 is 用于在整个组合中隐式地线程化参数并没有多大帮助
  • Java NIO 服务器/客户端聊天应用程序 - 仅通过关闭套接字来发送数据

    朋友们 我是 Java NIO 的新手 目前正在尝试制作一个非阻塞聊天应用程序 客户端连接到服务器没有问题 客户端向服务器写入一条消息或几条消息 但服务器仅在客户端代码关闭 Socket 连接时才开始读取消息 因此必须在客户端代码中为每条消
  • 使用 django-taggit 制作不区分大小写的标签

    我向我的模型添加了 Tags TaggableManager blank True 但我希望我的标签不区分大小写 我看到了一些解决此问题的片段 想问是否有一种简单的方法可以做到这一点 如果我必须重写 TaggableManager 中的某些
  • CMake 链接失败

    我正在为 CMake 配置我的项目 并且遇到链接问题 项目文件全部编译成功 然后它说它正在链接并报告未找到的各种符号 这些符号大部分是由我自己的代码提供的 其中一些是由 BerkeleyDB 提供的 它已被正确定位并包含在内 这是我的顶级
  • System.Runtime.InteropServices.SEHException(0x80004005):外部组件引发了异常

    我在 Windows7 和 VS2010 上使用 Net 3 5 用 C 编写了 32 位代码 并且运行没有任何问题 现在我使用 Net 4 0 将其转换为 64 位 但当我的代码调用 CloseHandle 时出现错误 错误 关闭句柄Sy
  • R的父框架是什么

    R的父框架是什么 顺便问一下 父框架是什么意思 我猜这是定义环境而不是调用环境 因为 R 使用词法作用域 但我不确定 谢谢 嗯 从 parent frame帮助页面 函数求值的父框架是调用该函数的环境 它的编号不一定比当前评估的帧编号小一
  • Javascript 有时会加载 HTML 中的内容,除非元素悬停在检查内

    我做了一个小部件 this的内容是由JS动态加载的 但是 有时当页面加载时 除非单击数据 否则数据不会显示在小部件上 即使进入检查并将鼠标悬停在任何元素上也会加载项目 下面两张图是点击前和点击后的效果 Update 1 单击不一定会加载数据
  • 获取可变参数模板的所有参数

    我有一个演员这样声明 template
  • 如何测量 Firebird 2.1 数据库上 blob 占用的空间量?

    我有一个使用 Firebird 2 1 的生产数据库 我需要找出每个表 包括 blob 使用了多少空间 blob 部分是棘手的部分 因为标准统计报告未涵盖它 我无法轻松访问服务器桌面 因此安装 UDF 等并不是一个好的解决方案 我怎样才能轻
  • Npm 不工作(openSSL 配置错误 windows10x64)

    每当我在 powershell 中尝试 npm 命令时 都会收到此错误 node v v17 1 0 npm v OpenSSL configuration error 74240000 error 80000003 system libr
  • 在 PHP 中使用数组实现不重复的随机数

    我正在尝试用 PHP 创建一个随机数生成器 它应该一次生成三 3 个数字 不重复 也就是说 这3个数字不能相同 到目前为止 这是我尝试过的 array A mt rand 1 36 array 0 A B mt rand 1 36 arra