【问题标题】:How to select a repeatable random number with setseed in postgres sql?如何在 postgresql 中选择具有设置种子的可重复随机数?
【发布时间】:2014-10-20 05:30:13
【问题描述】:

我想要实现的是为流程选择一个控制组。为此,我使用了 random(),并且为了调试/一致性,我希望能够以可重复的方式设置随机数。意思是,一旦它分配了用户 123 随机数 .001,我就会运行查询。在不同的时间我删除了以前的数据,我调用了相同的查询,并且再次为用户 123 分配了随机数 0.001。

我试过了:

SELECT setseed(0);
SELECT 1, random() from generate_series(1,10);

我每次运行都会收到一个不同的随机数。

SELECT 1, setseed(0), random() from generate_series(1,10);

每一行接收相同的随机数,这是没用的。

我确定这里有一些我不明白的地方。任何帮助表示赞赏。

【问题讨论】:

  • 对于第一个,您是否将其作为两个单独的语句从您的应用程序中运行?还是您将其作为包含两个语句的单个字符串发送?

标签: sql postgresql random random-seed


【解决方案1】:

使用所需查询执行setseed() 查询的union all。有必要匹配两个查询中的列类型。 setseed() 返回void

select setseed(0), null

union all

select null, random()
from generate_series(1, 10)

offset 1
;

offset 1 子句从结果集中消除了setseed() row

【讨论】:

  • 嘿,这个建议达到了目的。一个可重复的随机数!谢谢。但是,我确实必须将“''::void”替换为“null”,因为前者会在 postgresql 中引发“void not an integer error”。我会让它打开一点,看看其他人是否会以另一种方式加入,但感谢您的帮助。
  • @user3055034 是的,''::void 是错误的,但在 9.3.5 中它没有在这里抛出错误。你的版本是什么?
  • 了解为什么这是有效的而两个独立的语句无效会很有帮助。我没有看到让你得出这个结论的逻辑链。
  • @Craig 例如,OP 可能遇到的一个问题是 PHP 中的准备好的语句不允许多个语句:php.net/manual/en/function.pg-prepare.php
  • @ClodoaldoNeto 啊,所以您认为他们在单个应用程序 API 调用中运行了两条语句。很好的猜测,虽然很好解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多