【问题标题】:Creating sequences in MySQL?在 MySQL 中创建序列?
【发布时间】:2020-02-25 20:49:56
【问题描述】:

我在文章中看到我们可以使用函数 rand() 和 floor() 从 0 和 1 创建序列

mysql

SELECT floor(rand(0)*2) FROM security.users;

+------------------+
| floor(rand(0)*2) |
+------------------+
|                0 |
|                1 |
|                1 |
|                0 |
|                1 |
|                1 |
|                0 |
|                0 |
|                1 |
|                1 |
|                1 |
|                0 |
|                1 |
|                1 |
|                1 |
|                0 |
+------------------+
16 rows in set (0.00 sec)

还有其他方法可以实现这一点吗?
* 我不谈论 auto_increment ;

【问题讨论】:

  • 不清楚你到底想要什么。您要生成多少个数字(位?)?
  • 如果你想创建 0 和 1 的随机序列,那么 rand() 似乎它可能是一个有用的部分
  • rand() 看起来是一个直截了当的解决方案。
  • @Strawberry 正如我所说,我想要另一种方法来做到这一点
  • @GMB 正如我所说,我想要另一种方法来做到这一点,而不是 rand 和 floor

标签: mysql sql random


【解决方案1】:

如果随机性/可预测性的程度不重要,是的,还有其他方法可以生成 1 和 0 的序列。

例如,我们可以通过每隔一段时间从系统时钟中检索微秒来模拟 0 和 1 的伪随机生成,假设微秒值将是相当随机的偶数或奇数,如果我们将每个调用间隔一点点时间。

例如,像这样的:

SELECT n.i
  FROM ( SELECT MICROSECOND(SYSDATE(6)) MOD 2 AS i, SLEEP(0.000001)
         UNION ALL SELECT MICROSECOND(SYSDATE(6)) MOD 2, SLEEP(0.000001)
         UNION ALL SELECT MICROSECOND(SYSDATE(6)) MOD 2, SLEEP(0.000001)
         UNION ALL SELECT MICROSECOND(SYSDATE(6)) MOD 2, SLEEP(0.000001)
         UNION ALL SELECT MICROSECOND(SYSDATE(6)) MOD 2, SLEEP(0.000001)
         UNION ALL SELECT MICROSECOND(SYSDATE(6)) MOD 2, SLEEP(0.000001)
       ) n

返回:

     i  
  ----
     0
     0
     1
     1
     0
     1  

注意:这个答案是“是”,还有其他生成 1 和 0 的方法。这个答案并不是暗示这里的演示是最好的方式。这只是一个生成一系列 1 和 0 的查询示例。


还有其他带有 RAND() 的表达式会生成 0 或 1,例如

ROUND(RAND()*1000,0) MOD 2

【讨论】:

  • 没有我知道的文章。对于 MySQL,要在 MySQL 语句中获取不同的时间值,请使用 SYSDATE() 函数而不是 NOW()(NOW() 函数在语句执行开始时被评估一次,因此语句中的所有引用返回相同的值。参数 6 获取包含小数秒的返回,例如2019-10-30 14:49:28.064657MICROSECOND() 函数提取小数秒。MOD 运算符是模除法,返回余数。等效于MOD() 函数。MySQL 参考手册dev.mysql.com/doc/refman/8.0/en/func-op-summary-ref.html
猜你喜欢
  • 2014-12-22
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多