MySQL rand()函数、rand(n)、生成不重复随机数

news2024/11/26 18:39:58

文章目录

  • 一、rand()与rand(n)
  • 二、rand()使用示例
    • 2.1、rand()与order by/group by使用随机排序分组
    • 2.2、round()与rand()的组合使用
    • 2.3、rand与ceiling的组合使用
    • 2.4、rand与floor组合使用
    • 2.5、rand与md5组合使用
  • 三、总结
    • 3.1、rand()与rand(n)的区别

有时候我们想要生成一个唯一不重复的随机数,mysql提供了rand()函数来实现该功能。

本文首先介绍rand()的基本使用
其次分别介绍round与rand的合用、ceiling与rand的合用、floor与rand的合用、md5与rand的合用

一、rand()与rand(n)

  • rand() 即无参数的,会生成一个[0,1)之间的float型随机数。此时产生的随机数是随机的,不可重复的

  • rand(n),即有参数数,它会使用参数n作为随机数生成的种子。每次使用相同的种子值n,将得到相同的随机排序结果。因此这种随机数是可重复的。这种随机数也是伪随机的‌

rand(n)函数:

  • n是int类型的数字,所以只要是数字就行。不同的种子值生成的随机数是不一样的;对于同一个种子值n,每次返回的随机数是固定的。
  • 同一次查询时,结果集中可能会产生重复随机数。
  • 多次查询时,每次返回的随机数与上一次是一致的。

注意:频繁地在一个很大的数据集上使用RAND()可能会导致性能问题,因为这会导致数据库引擎在每次查询时都生成一个新的随机数。

示例如下:

mysql> select rand(),rand(),rand();
+--------------------+--------------------+-------------------+
| rand()             | rand()             | rand()            |
+--------------------+--------------------+-------------------+
| 0.9601070507989331 | 0.7956807881553478 | 0.098082819113585 |
+--------------------+--------------------+-------------------+
1 row in set (0.00 sec)

mysql> select rand(1),rand(1),rand(1);
+---------------------+---------------------+---------------------+
| rand(1)             | rand(1)             | rand(1)             |
+---------------------+---------------------+---------------------+
| 0.40540353712197724 | 0.40540353712197724 | 0.40540353712197724 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)

我们发现:

  • 当直接调用rand()函数时,每次生成的随机数都是不同的。
  • 当直接调用rand(n)函数时,若种子n相同,则生成的随机数是可重复且多次查询是一致的。

上面我们说rand(n)函数,每次使用相同的种子值n,将得到相同的随机排序结果,这是什么意思呢?为了便于理解上面两种示例,我们把rand(),rand(n) 结合表数据一起看一下。

mysql> CREATE TABLE t (i INT);
Query OK, 0 rows affected (0.42 sec)

mysql> INSERT INTO t VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
-- 如下:rand()函数查询了两次,每次查询每一行返回的随机数都不相同
mysql> SELECT i, RAND() FROM t;
+------+------------------+
| i    | RAND()           |
+------+------------------+
|    1 | 0.61914388706828 |
|    2 | 0.93845168309142 |
|    3 | 0.83482678498591 |
+------+------------------+
3 rows in set (0.00 sec)

mysql> SELECT i, RAND() FROM t;
+------+------------------+
| i    | RAND()           |
+------+------------------+
|    1 | 0.35877890638893 |
|    2 | 0.28941420772058 |
|    3 | 0.37073435016976 |
+------+------------------+
3 rows in set (0.00 sec)
-- 如下:rand(n)函数查询了两次
-- 同一次查询中可能会返回重复的数字(注意:数据量小的情况不一定有重复值)
-- 但是多次查询时,第二次与第一次返回的结果相同。
mysql> SELECT i, RAND(3) FROM t;
+------+------------------+
| i    | RAND(3)          |
+------+------------------+
|    1 | 0.90576975597606 |
|    2 | 0.37307905813035 |
|    3 | 0.90576975597606 |
+------+------------------+
3 rows in set (0.00 sec)

mysql> SELECT i, RAND(3) FROM t;
+------+------------------+
| i    | RAND(3)          |
+------+------------------+
|    1 | 0.90576975597606 |
|    2 | 0.37307905813035 |
|    3 | 0.90576975597606 |
+------+------------------+
3 rows in set (0.01 sec)

可以发现:

  • rand()函数:每次查询都生成不一样的数据。同一次查询中每行数据的随机数都不一样;多次查询时与上一次生成的随机数也不一致
  • rand(n)函数:同一次查询中数据可能会产生重复(注意:数据量小的情况不一定有重复值);多次查询时与上一次生成的随机数是一致的。 即是指定了随机数的种子,那么多次查询的结果是一样的

二、rand()使用示例

2.1、rand()与order by/group by使用随机排序分组

rand()函数用于随机生成一个不重复的数字,所以当rand()与order by组合使用时,可以实现数据随机排序。
使用场景: 例如可以用于样本抽样,先对数据进行随机排序,然后抽取前x条。

注意因为是随机排序,所以每次返回不同的结果。如果目标是以随机顺序检索行,则可以使用这样的语句。

SELECT * FROM tbl_name ORDER BY RAND();

2.2、round()与rand()的组合使用

round(n,m):对处理的数据进行四舍五入,
n:处理的数据
m:保留的小数位数

实例1.获取某个区间的数据

-- 获取0-100之间的整数
select round(100*rand(),0)

在这里插入图片描述
实例2:获取[40,60)的两位小数

select 40+round(20*rand(),2)
ps:2060-40的差值

在这里插入图片描述

2.3、rand与ceiling的组合使用

ceiling(n):对于数据n向上取整

实例1:select ceiling(1.12)

在这里插入图片描述
实例2:select ceiling(rand());
rand():随机在[0,1)之间,故结果肯定为1

在这里插入图片描述

实例3:随机获取[60,80)之间的整数

select ceiling(60+rand()*20);

在这里插入图片描述

2.4、rand与floor组合使用

floor():是向下取整

实例1:select floor(53.68)
在这里插入图片描述

实例2:select floor(rand());
ps:rand()向下取整必然为0
在这里插入图片描述

实例3:[40,52)之间取整

select floor(40+rand()*12);

在这里插入图片描述

2.5、rand与md5组合使用

md5(n):必须要有参数n,计算n对应的md5摘要,并返回32位的十六进制的字符串
ps:如果n为 NULL,MySQL MD5() 函数返回 NULL

实例1:select md5(123.44);
在这里插入图片描述

实例2:select md5(rand());
在这里插入图片描述

三、总结

3.1、rand()与rand(n)的区别

rand()函数

  • 每次生成是随机数都是不一致且不重复的。
  • 适用场景:样本抽样,对数据随机排序后获取前x条。每次排序的结果都是随机的、不一致的。

rand(n:int)函数

  • n是个int类型的种子参数,每个种子生成的随机数都是不同的。但是相同的种子每次返回的随机数都是固定的。如rand(2)每次返回的值是固定的。
  • 同一次查询时结果集中可能会产生重复的数字。
  • 多次查询时每次返回的随机数与上一次查询结果一致。
  • 适用场景:用于需要重复生成相同随机数序列的场景,例如模拟实验或测试中需要重复执行相同的随机操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2231976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 文章目录 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC1. 介绍 二. 参考文献 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 如何在 Ubuntu 22.04 上安装和配置 VNChttps://hub.docker.c…

ubuntu22-安装vscode-配置shell命令环境-mac安装

文章目录 1.安装vscode2.修改语言为中文3.配置bash调试环境3.1.安装插件3.2.添加配置文件 4.调试bash4.1.新建tmp.sh文件4.2.运行启动 5.mac安装6.mac卸载 1.安装vscode 从官网下载安装包Code_1.93.1-1726079302_amd64.deb。 在ubuntu系统中,安装包所在目录打开命令…

MongoDB 8.0.3版本安装教程

MongoDB 8.0.3版本安装教程 一、下载安装 1.进入官网 2.选择社区版 3.点击下载 4.下载完成后点击安装 5.同意协议,下一步 6.选择第二个Custon,自定义安装 7.选择安装路径 !记住安装路径 8.默认,下一步 9.取…

编程八种语言谁是最受市场青睐的?

你听说过"编程语言江湖"吗?在这个瞬息万变的IT世界里,各种编程语言就像武林高手,各展绝技,争夺"武林盟主"的宝座。 1. JavaScript/TypeScript: 江湖新贵的崛起江湖中有一句老话:"十年磨一剑,霜刃未曾试…

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西,其中TableGen占了一部分,所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客,学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…

openpnp - 在openpnp中单独测试相机

文章目录 openpnp - 在openpnp中单独测试相机概述笔记测试工装相机镜头顶部盖子到目标的距离END openpnp - 在openpnp中单独测试相机 概述 底部相机的位置不合适, 重新做了零件,准备先确定一下相机和吸嘴的距离是多少才合适。 如果在设备上直接实验,那…

联动香港、成都、武汉三所高校!“2024 深圳国际金融科技大赛”校园行圆满结束

在金融科技蓬勃发展的当下,人才培养成为推动行业前行的关键。为推进深圳市金融科技人才高地建设,向高校学子提供一个展示自身知识、能力和创意的平台,2024 FinTechathon 深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛重磅开启&#xf…

【SQL Server】华中农业大学空间数据库实验报告 实验一 数据库

实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法,认识界面,了解其两个基本操作系统文件,并能熟练区分与应用交互式与T-SQL式两种方法在SQL Server中如何进行操作;学习有关数据库的基本操作,包括&#xff1a…

LeetCode:83. 删除排序链表中的重复元素 II(java) 保留一个重复的

目录 题目描述: 代码: 第一种: 第二种: 题目描述: 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2&#xff1a…

【快速上手】pyspark 集群环境下的搭建(Standalone模式)

目录 前言 : 一、spark运行的五种模式 二、 安装步骤 安装前准备 1.第一步:安装python 2.第二步:在bigdata01上安装spark 3.第三步:同步bigdata01中的spark到bigdata02和03上 三、集群启动/关闭 四、打开监控界面验证 前…

SpringSecurity6+OAuth2.0 从入门到熟练使用

文章目录 简介1、快速入门1.1 准备工作我们先要搭建一个SpringBoot工程① 创建工程 添加依赖② 创建启动类③ 创建Controller1.2 引入SpringSecurity2、 认证2.1 登录校验流程2.2 原理分析2.2.1 SpringSecurity完整流程2.2.2 认证流程详解概念速查:2.3 解决问题2.3.1 思路分析2…

Qt报错QOCI driver not loaded且QOCI available的解决方法

参考 Linux Qt 6安装Oracle QOCI SQL Driver插件(适用WSL) 安装 QOCI 插件完成后运行 Qt 项目报错: qt.sql.qsqldatabase: QSqlDatabase: QOCI driver not loaded qt.sql.qsqldatabase: QSqlDatabase: available drivers: QMIMER QPSQL QODBC…

【AI工作流】FastGPT - 深入解析FastGPT工作流编排:从基础到高级应用的全面指南

文章目录 一、工作流编排概述二、FastGPT的节点类型1. 基础功能插件(1) 文本输出(2) 功能调用(3) 工具(4) 外部调用(5) 其他 2. 系统插件3. 团队插件 三、工作流中的流向结语 在当今快速发展的人工智能领域,工作流编排的能力已成为提升用户体验和应用效率的关键因素…

SQL 常用语句

目录 我的测试环境 学习文档 进入数据库 基础通关测验 语句-- 查 展示数据库; 进入某个数据库; 展示表: 展示某个表 desc 查询整个表: 查询特定列: 范围查询 等于特定值 不等于 介于 特定字符查询 Li…

python在word的页脚插入页码

1、插入简易页码 import win32com.client as win32 from win32com.client import constants import osdoc_app win32.gencache.EnsureDispatch(Word.Application)#打开word应用程序 doc_app.Visible Truedoc doc_app.Documents.Add() footer doc.Sections(1).Footers(cons…

Centos环境下安装docker

本文演示离线版安装用于没有网络环境的系统 在线版安装可参考以下链接 https://www.runoob.com/docker/centos-docker-install.html 一、docker离线安装 1、下载docker离线安装包 docker下载地址: Docker版本下载 选择版本 下载后上传至服务器 百度网盘下载…

Java 中的 Map 集合及其子类详解:HashMap 和 TreeMap

Java 中的 Map 集合及其子类详解:HashMap 和 TreeMap 在 Java 编程中,Map 是一种用于存储键值对的集合结构。Java 提供了多种 Map 实现类,其中最常用的是 HashMap 和 TreeMap。 双列集合 在Java中,双列集合(也称为映…

CoCode助力志晟信息成功通过CMMI五级复评!

热烈祝贺河北志晟信息技术股份有限公司在近期CMMI(能力成熟度模型集成)评估中,再次以卓越表现顺利通过CMMI成熟度五级的复评。 CoCode助力志晟信息通过CMMI五级 2024年9月1日至10日,CMMI评估组对志晟信息管理体系及其应用运行情况…

AD 授予委派full control权限后,部分用户无法unlock

文章目录 问题描叙根因解決方法: 问题描叙 通過委派方式授予被委派用戶full control 权限后,部分用户unlock是灰色显示: 根因 对比能正常unlock与无法unlock的用户,发现繼承無法unlock的用戶沒有"enable inheritance&quo…

css实现边框双色凹凸半圆

整体效果如下图&#xff1a; 结构代码&#xff1a; <div classline-outside-wrap><div classwrap><img src../img/avatar2x.png/><div classcontent-wrap></div></div></div> 内凹框实现&#xff1a; .content-wrap{width:100%;he…