天道酬勤,学无止境

MySQL RAND() 种子值几乎重复(MySQL RAND() seed values almost repeat)

问题

在 Windows 7 上使用 MySQL 5.6.21。

我试图从按日期播种的表中返回一个“随机”行(因此当天返回同一行,然后在第二天切换等 - 如果您愿意,可以使用“日期生成器的随机报价”)。

我注意到相同的行不断出现,所以我将查询简化为它的基础,看起来 RAND() 函数每四个种子值生成非常相似的数字。 当四舍五入为整数时,这些值似乎每四个种子重复一次。 这个例子只使用了 16 行,但你明白了。

create table t (i INT);

insert into t values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);

select i, ceil(rand(i) * 16), rand(i) from t;

drop table t;

给...

0   3   0.15522042769493574
1   7   0.40540353712197724
2   11  0.6555866465490187
3   15  0.9057697559760601
4   3   0.15595286540310166
5   7   0.40613597483014313
6   11  0.6563190842571847
7   15  0.9065021936842261
8   3   0.15668530311126755
9   7   0.406868412538309
10  11  0.6570515219653505
11  15  0.907234631392392
12  3   0.15741774081943347
13  7   0.40760085024647497
14  11  0.6577839596735164
15  15  0.9079670691005579

不是我所期望的,所以我做错了什么? 我期望生成一个伪随机序列。

回答1

根据文档 RAND(n) 仅在 n 为常数时才能正常工作。 使用非常量参数的效果是不确定的。 从 MySQL 5.0.13 开始,不允许非常量参数。

正如他们所说, RAND() 并不意味着是一个完美的随机生成器。 这是一种按需生成随机数的快速方法,可在同一 MySQL 版本的平台之间移植。

MySQL 文档

检查如果使用不带参数的 RAND() 会发生什么。

回答2

RAND() 并不是一个完美的随机数生成器,所以如果它不合适,那么应该使用其他生成随机数的方法。 就我而言,我需要每天对行进行不同的排序,而RAND(CURDATE()+0)被证明是一个可行的解决方案。

是的,似乎第一项的周期是 4,每次种子增加 4 时,它都会被赋予一个类似的随机数。

我从我自己的随机数生成基本测试中得到以下结果,并使用种子编号 0、4、8 和 12,每次将种子增加 4。

  • 第 1 行:增加约 0.001
  • 第 2 行:增加约 0.005
  • 第 3 行:增加约 0.02
  • 第 4 行:增加约 0.05
  • 第 5 行:增加约 0.2
  • 第 6 行:减少约 0.01(或增加 0.99)
  • 第 7 行:增加约 0.26

在 OP 的示例中,由于它们不使用恒定的种子数,因此从技术上讲,它们的样本大小为 1。随着行数的增加,对重复索引的影响会减小,并且其他项目出现在或之前的可能性更高在他们以前没有的其他项目之后。

我从使用RAND()得出的几个警告:

如果RAND()仅用作SELECT列或WHERE条件,并且指定了LIMIT ,则RAND()将只为每个返回的行生成一次。

CREATE TABLE t (i INT);
INSERT INTO t VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);
SELECT i, RAND(0) FROM t LIMIT 0, 1; # 0, 0.15522042769493574
SELECT i, RAND(0) FROM t LIMIT 1, 1; # 1, 0.15522042769493574

如果RAND()在使用ORDER BY语句,则RAND()将所有匹配的行计算无论任何的LIMIT

CREATE TABLE t (i INT);
INSERT INTO t VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);
SELECT i, RAND(0) FROM t ORDER BY RAND(0) LIMIT 0, 1; # 0, 0.15522042769493574
SELECT i, RAND(0) FROM t ORDER BY RAND(0) LIMIT 1, 1; # 6, 0.2964166321758336

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用MySQL生成随机且唯一的8个字符串(Generating a random & unique 8 character string using MySQL)
    问题 我正在开发一款涉及车辆的游戏。 我有一个名为“车辆”的MySQL表,其中包含有关车辆的数据,包括存储车辆牌照的“牌照”列。 现在是我遇到问题的部分了。 在创建新车辆之前,我需要找到一个未使用的车牌-它应该是8个字母数字的随机字符串。 我是通过使用Lua(我正在使用的语言)中的while循环生成字符串并查询数据库以查看是否使用它的,从而实现了这一目标。 但是,随着车辆数量的增加,我希望这会变得目前效率更低。 因此,我决定尝试使用MySQL查询解决此问题。 我需要的查询应该只生成表中还没有的8个字符的字母数字字符串。 我再次想到了generate&check循环方法,但是我并没有将这个问题限制为以防万一,这是一个更有效的方法。 我已经能够通过定义包含所有允许的字符的字符串并随机将其子串化来生成字符串,仅此而已。 任何帮助表示赞赏。 回答1 此问题包含两个非常不同的子问题: 该字符串看似必须是随机的字符串必须是唯一的 尽管很容易实现随机性,但没有重试循环的唯一性却不容易。 这使我们首先专注于独特性。 使用AUTO_INCREMENT可以轻松实现非随机唯一性。 因此,使用保留唯一性的伪随机转换就可以了: @paul已建议使用哈希 AES加密也适用但是有一个不错的选择: RAND(N)本身! 保证由相同种子创建的随机数序列是 可复制的在前8次迭代中有所不同如果种子是INT32 因此
  • 从 MySQL 数据库中获取随机数据但不重复数据(Getting random data from a MySQL database but not repeating data)
    问题 我有一个随机产品列表(1000 个),每个产品都有一个 ID,我是随机提供它们的。 我希望这些项目不会重复。 目前我正在做的是以下内容: select * from products where product_id <> previous_product_id order by rand() limit 1; 我确保之后不会直接出现相同的产品。 重复产品通常比我想要的更早出现(我相信我说这是生日问题是正确的)。 我不知道以非重复方式获取随机数据的最有效方法是什么。 我想到了一种我认为非常低效的方法: 我会为用户分配一个 id(例如 foo),然后当他们看到一个项目时,将其添加到一个字符串中,该字符串将是product_id_1 AND product_id_2 AND product_id_3 AND product_id_n 。 我会用timestamp(explained further on)存储这些数据timestamp(explained further on) 。 +--------------------------------------------------------------------------------------------+ |user_id |timestamp | product_seen_string | |-----------
  • MySQL RAND() seed values almost repeat
    Using MySQL 5.6.21 on Windows 7. I am attempting to return a 'random' row from a table seeded by the date (so the same row returns for the current day and then switches the next day etc - a "random quote of the day generator" if you like). I noticed the same rows keep coming up so I simplified the query to its basics, it appears the RAND() function generates very similar numbers every fourth seed value. When rounded to an integer the values appear to repeat every fourth seed. This example only uses 16 rows, but you get the idea. create table t (i INT); insert into t values(0),(1),(2),(3),(4)
  • 推荐初始化srand的方法?(Recommended way to initialize srand?)
    问题 我需要一种“好的”方式来初始化C ++中的伪随机数生成器。 我发现一篇文章指出: 为了生成类似随机数的数字,通常将srand初始化为一些与众不同的值,例如与执行时间相关的值。 例如,函数时间(在头文件ctime中声明)返回的值每秒都是不同的,这足以满足大多数随机需求。 Unixtime对于我的应用程序而言还不够独特。 有什么更好的初始化方法? 如果它是可移植的,则有很多好处,但是代码将主要在Linux主机上运行。 我正在考虑做一些pid / unixtime数学来获取一个int,或者可能从/dev/urandom读取数据。 谢谢! 编辑 是的,我实际上每秒多次启动我的应用程序,并且遇到了冲突。 回答1 最好的答案是使用Boost随机数的东西。 或者,如果您有权访问C ++ 11,请使用<random>标头。 但是,如果我们谈论的是rand()和srand() 最好的方法就是使用time() : int main() { srand(time(NULL)); ... } 确保在程序开始时执行此操作,而不是每次调用rand()都要执行此操作! 每次启动时,time()都会返回一个唯一值(除非您每秒多次启动该应用程序)。 在32位系统中,它将仅每60年左右重复一次。 我知道您认为时间不够独特,但我很难相信。 但是众所周知,我错了。 如果同时启动许多应用程序副本
  • 如何使用 rand-int 生成可重复的随机序列(How to generate repeatable random sequences with rand-int)
    问题 我希望能够在 Clojure 中使用rand生成可重复的数字。 (具体来说,我希望对rand-nth或 Incanter sample的调用结果是可重复的,并且这些调用rand-int又调用rand )。 我从这个问题中发现,如果我使用 clojure.data.generators,我可以重置随机状态: (require '[clojure.data.generators :as gen]) (alter-var-root #'gen/*rnd* (constantly (java.util.Random. 437))) (gen/reservoir-sample 5 (range 1000)) ; => [940 591 636 12 755] (gen/reservoir-sample 5 (range 1000)) ; => [376 540 827 307 463] ; reset random state: (alter-var-root #'gen/*rnd* (constantly (java.util.Random. 437))) ; now the same results are generated again: (gen/reservoir-sample 5 (range 1000)) ; => [940 591 636 12 755] (gen
  • 如何在SQL中请求随机行?(How to request a random row in SQL?)
    问题 如何在纯SQL中请求随机行(或尽可能接近真正的随机行)? 回答1 参见这篇文章:SQL从数据库表中选择一个随机行。 它介绍了在MySQL,PostgreSQL,Microsoft SQL Server,IBM DB2和Oracle中执行此操作的方法(以下内容从该链接复制而来): 使用MySQL选择一个随机行: SELECT column FROM table ORDER BY RAND() LIMIT 1 使用PostgreSQL选择一个随机行: SELECT column FROM table ORDER BY RANDOM() LIMIT 1 使用Microsoft SQL Server选择一个随机行: SELECT TOP 1 column FROM table ORDER BY NEWID() 使用IBM DB2选择随机行 SELECT column, RAND() as IDX FROM table ORDER BY IDX FETCH FIRST 1 ROWS ONLY 使用Oracle选择一个随机记录: SELECT column FROM ( SELECT column FROM table ORDER BY dbms_random.value ) WHERE rownum = 1 回答2 杰里米(Jeremies)等解决方案: SELECT * FROM
  • 使用 srand() 避免重复生成种子(Avoiding Repeated seed generation using srand())
    问题 我有一个典型的情况,我需要生成一批随机数。 我使用了一个循环,每次通过都会生成 100 个随机数: for(int i=0; i<npasses; i++) { srand(time(NULL)); //Initialize seed for(int j=0; j<100; j++) printf("%d ", rand()%10); printf("\n"); //New line after 100 numbers } 现在,内循环的执行时间不到一毫秒。 因此,time() 的值没有变化。 这将种子 (srand()) 重新初始化为相同的值,并且我的随机数被重复.. 任何人都可以建议解决方法/修复。 回答1 在循环之前设置一次种子。 回答2 保留srand : srand(time(NULL)); //Initialize seed for(int i=0; i<npasses; i++) { for(int j=0; j<100; j++) printf("%d ", rand()%10); printf("\n"); //New line after 100 numbers } 回答3 试试这个 srand(clock()); //Initialize seed 回答4 您可以使用随机生成器生成新种子。 例如: srand((unsigned int)rand())
  • 打招呼不止一次如何影响随机性的质量?(How does calling srand more than once affect the quality of randomness?)
    问题 该评论指出: srand(time(0)); 如果多次调用它,我会将其作为main()的第一行(这实际上会导致较少的随机数)。 ...并且我已经加粗了我遇到问题的那一行...重复了在程序中一次调用srand的常见建议。 诸如srand()之类的问题-为什么只调用一次? 再次重申,由于time(0)以秒为单位返回当前时间,因此在同一秒内多次调用srand将产生相同的种子。 常见的解决方法是改用毫秒或纳秒。 但是,我不明白为什么这意味着srand应该或只能被调用一次,或者它如何导致更少的随机数。 cppreference: 一般来说,伪随机数生成器在调用rand()和程序启动之前,只能种子一次。 每次要生成新一批伪随机数时,都不应重复播种或重新播种。 phoxis对srand()的回答-为什么只调用一次? 用种子值初始化一次初始状态将生成足够的随机数,因为您无需将内部状态设置为srand,因此使这些数更有可能是随机的。 也许他们只是在使用不精确的语言,似乎没有一种解释可以解释为什么多次调用srand是不好的(除了产生相同的随机数序列)还是它如何影响数字的“随机性”。 有人可以帮我清理一下吗? 回答1 从以下问题看srand()的来源:Rand实现 此外,该线程的示例实现: static unsigned long int next = 1; int rand(void) //
  • 如果我不指定srand(),rand()使用什么种子?(If I don't specify srand(), what seed does rand() use?)
    问题 这是代码: #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int r; int i; for (i = 0; i < 100; i++) { r = rand() % 100 + 1; printf("%d\n", r); } return 0; } 我一直在尝试对数字进行随机化,但是有一天,我忘记放入srand()了,但是rand()函数仍然可以对数字进行随机化(相同的顺序)。 问题是,如果我不指定种子,它将使用什么种子? 回答1 如果未调用srand,则rand的行为就像已调用srand(1)一样。 http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.13.html#rand 回答2 C标准实际上规定了其他答案中记录的行为: ISO / IEC 9899:2011§7.22.2.2的srand功能 ¶2[...]如果在对srand进行任何调用之前调用rand ,则应生成与第一次以种子值1调用srand时相同的序列。 回答3 手册页指出以下内容: srand()函数将其参数设置为rand()返回的新伪随机整数序列的种子。 通过调用具有相同种子值的srand()可以重复这些序列。 如果未提供种子值,则rand(
  • 二进制日志和数据更新的关系
    二进制日志和数据和数据库操作(ddl,实质未造成改变的语句,自定义变量,随机函数,自增主键,外部导入数据,与非同步库关联更新,存储过程,函数,触发器,事件等)关系二进制日志的本质是记录数据的改变如果数据没有改变,就一定不记录二进制日志吗记录数据改变的情况:1.所有可能对数据结构造成改变的ddl语句 alter,create,drop,grant,revoke等 2. insert,delete,update语句可能对数据更新的语句 3.select绝大部分情况下是不会记录的1.ddl语言 create table test2 (id ,int); mysql> show binlog events in 'mysql-bin.000007';+------------------+-----+-------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+-------------------------------------
  • 随机数,不等于前一个数字(Random number, which is not equal to the previous number)
    问题 我需要获取随机数,但它不应等于先前的数字。 这是我的代码。 但这是行不通的。 function getNumber(){ var min = 0; var max = 4; var i; i = Math.floor(Math.random() * (max - min)) + min; if (i=== i) { i = Math.floor(Math.random() * (max - min)) + min; } return i; }; console.log(getNumber()); 回答1 该答案提出了三种尝试 一个简单的版本,具有功能getNumber , last的属性,该属性存储最后一个随机值。 一个版本,该版本对min和max值使用闭包,并且在max小于min引发异常。 一个结合了闭包和保留所有随机值并在适当时使用它的想法的版本。 一 您可以使用getNumber的属性存储最后一个数字,并使用do ... while循环。 function getNumber() { var min = 0, max = 4, random; do { random = Math.floor(Math.random() * (max - min)) + min; } while (random === getNumber.last); getNumber.last =
  • 为什么我总是用rand()获得相同的随机数序列?(Why do I always get the same sequence of random numbers with rand()?)
    问题 这是我第一次使用C尝试随机数(我想念C#)。 这是我的代码: int i, j = 0; for(i = 0; i <= 10; i++) { j = rand(); printf("j = %d\n", j); } 有了这段代码,我每次运行代码都会得到相同的顺序。 但是,如果我在for循环之前添加srand(/*somevalue/*) ,它将生成不同的随机序列。 谁能解释为什么? 回答1 您必须播种。 随时间播种是个好主意: srand() #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { srand ( time(NULL) ); printf ("Random Number: %d\n", rand() %100); return 0; } 您得到相同的序列,因为如果不调用srand()则rand()会自动以1的值作为种子。 编辑 由于评论 rand()将返回一个介于0和RAND_MAX之间的数字(在标准库中定义)。 使用模运算符( % )得出除法rand() / 100的余数。 这将强制随机数在0-99范围内。 例如,要获取0-999范围内的随机数,我们将应用rand() % 1000 。 回答2 rand()返回伪随机数。 它根据给定的算法生成数字。
  • 随机数生成器-为什么每次都播种(Random number generator - why seed every time)
    问题 我是C和C ++的新手。 在Java(我用来编程的语言)中,它非常容易实现随机数生成。 只需从名为Math的类中调用静态随机方法即可。 int face = ((int)(Math.random() * 6) + 1); 模拟掷骰子... 在c和c ++中,您必须通过调用srand函数来“种子随机数生成器” srand ( time(NULL) ); 这样做有什么意义-我的意思是每次运行代码时都必须为随机数生成器提供种子有什么好处? 回答1 给定相同的种子,伪随机数生成器每次都会产生相同的序列。 因此,这取决于您是否每次运行都需要不同的伪随机数序列。 这真的取决于您的需求。 有时您想重复一个序列。 而当你不这样做的时候。 您需要了解每个特定应用程序的需求。 永远不要做的一件事是在生成单个序列期间重复进行种子。 这样做很可能会破坏序列的分布。 回答2 通常称为随机数生成器的实际上是伪随机数生成器。 这通常意味着,如果您为该序列提供“密钥”(称为“种子”),则可以生成相同的随机序列。 当您希望测试基于随机化的算法并且需要确保可重复的结果时,这非常有用。 如果您不“播种”您的随机数生成器,则默认情况下会使用一些(通常基于系统时间)随机数作为种子,因此每次您运行程序时都会生成不同的序列。 回答3 如果不为生成器提供种子,则每次运行程序时,它都将具有相同的种子
  • 为什么C ++ stdlib rand()函数在跨平台的同一个种子中给出不同的值?(Why does the C++ stdlib rand() function give different values for the same seed across platforms?)
    问题 我知道rand()函数根据给定的种子生成伪随机数,并且在给定的平台上,它将始终从同一种子生成相同的数字序列,我想知道的是为什么它给出使用相同库的平台之间的顺序不同吗? 即rand()如何实现? 回答1 C ++标准未指定rand()函数使用什么算法。 该功能由在系统上编写标准库的人定义:Microsoft用于Visual Studio附带的标准库,以及用于GCC打包的标准库的GNU专家。 您的编译器正在选择从何处获取其库,因此对于同一系统上的不同编译器,您可能具有不同版本的标准库。 重点仍然是相同的:规范保证了可用的功能以及它们的功能; 而不是他们如何做到的。 回答2 rand()函数应计算范围为[0,{RAND_MAX}]且周期至少为2 ^ 32的伪随机整数序列。 rand_r()函数应计算范围为[0,{RAND_MAX}]的伪随机整数序列。 ({RAND_MAX}宏的值至少应为32767。) 如果用种子指向的对象以相同的初始值调用rand_r(),并且在连续返回和调用rand_r()之间未修改该对象,则应生成相同的序列。 srand()函数使用该参数作为新的伪随机数序列的种子,该序列将由对rand()的后续调用返回。 如果随后以相同的种子值调用srand(),则应重复伪随机数的序列。 如果在对srand()进行任何调用之前调用rand()
  • 在Clojure中使用种子时,为什么不重复生成可重复的随机数?(Why doesn't repeatedly generate reproducible random numbers when using a seed in Clojure?)
    问题 我有一些需要一系列随机数的函数,因此我采用了一些简单的原语,例如#(inc (g/uniform 0 n)) ,尽管我似乎无法生成可重现的一系列随机数。 'm rebinding *rnd* ,除非我如下所示生成它们。 我无法想象这是最好的方法,所以谁能指出如何做得更好? 注意:我将每个示例运行如下所示的三次,以产生给定的结果。 (ns example.show (:require [clojure.data.generators :as g])) (binding [g/*rnd* (java.util.Random. 42)] (take 10 (repeatedly #(inc (g/uniform 0 n)))) => (9 4 5 4 4 5 1 8 2 9) => (2 1 1 6 3 10 10 4 1 9) => (10 4 7 8 9 6 10 1 8 3) (binding [g/*rnd* (java.util.Random. 42)] (g/reps 10 #(inc (g/uniform 0 n))) => (3 9 4 6 3 8 6 6 5 4) => (7 8 4 7 7 5 7 4 8 7) => (2 8 7 8 8 8 9 2 6 5) ;; This seems to work (binding [g/*rnd* (java.util
  • 为什么rand()%6有偏见?(Why is rand()%6 biased?)
    问题 在阅读如何使用std :: rand时,我在cppreference.com上找到了此代码 int x = 7; while(x > 6) x = 1 + std::rand()/((RAND_MAX + 1u)/6); // Note: 1+rand()%6 is biased 右边的表达式有什么问题? 尝试了一下,它完美地工作。 回答1 rand() % 6有两个问题( 1+不会影响任何一个问题)。 首先,正如几个答案所指出的那样,如果rand()的低位rand() ,则余数运算符的结果也不一致。 其次,如果rand()产生的不同值的数量不是6的倍数,则其余值将产生比高值更多的低值。 即使rand()返回完美分布的值也是如此。 举一个极端的例子,假设rand()产生[0..6]范围内的均匀分布值。 如果看一下余数对这些值,当rand()返回的范围内的值[0..5]余量产生均匀分布在范围结果[0..5] 当rand()返回6时, rand() % 6返回0,就像rand()返回0一样。因此,您得到的0分配是其他任何值的两倍。 第二个是rand() % 6的实际问题。 避免该问题的方法是丢弃将产生非均匀重复项的值。 您计算出小于或等于RAND_MAX的6的最大倍数,并且只要rand()返回的值大于或等于该倍数,您就拒绝它并再次调用`rand(),这是需要的多次。 所以:
  • 可用:种子随机(Ada: Seeding Random)
    问题 如何用离散值种子 Ada.Numerics.Discrete_Random? 我看到这样的代码: declare type Rand_Range is range 25..75; package Rand_Int is new Ada.Numerics.Discrete_Random(Rand_Range); seed : Rand_Int.Generator; Num : Rand_Range; begin Rand_Int.Reset(seed); Num := Rand_Int.Random(seed); Put_Line(Rand_Range'Image(Num)); end; 用“种子”值播种“Rand_Int”,但我找不到有关实际设置种子值的任何说明。 或者我完全以错误的方式看待这个? 我想将种子值设置为我可以控制以观察测试结果的数字(如 4 或 5)。 谢谢! 回答1 将第二个Integer参数传递给Reset 。 这里是initiator 。 Rand_Int.Reset(seed, initiator); Ada 是少数免费提供完整、详细的参考手册和基本原理的语言之一。 用它! 此外,这里是更新的 Ada 版本标准。 另一个注意事项:代码中的变量名seed是一个糟糕的选择。 像state或generator这样的选择会好得多。 注意:Ada
  • 如何在C ++中生成一个随机数?(How to generate a random number in C++?)
    问题 我正在尝试制作带有骰子的游戏,并且需要在其中包含随机数(以模拟骰子的侧面。我知道如何在1到6之间进行游戏)。 使用 #include <cstdlib> #include <ctime> #include <iostream> using namespace std; int main() { srand((unsigned)time(0)); int i; i = (rand()%6)+1; cout << i << "\n"; } 效果不是很好,因为当我几次运行程序时,得到的输出是: 6 1 1 1 1 1 2 2 2 2 5 2 所以我想要一个命令,每次都会生成一个不同的随机数,而不是连续生成5次相同的随机数。 有命令可以做到这一点吗? 回答1 测试应用程序的最根本的问题是,你调用srand一次,然后调用rand一次并退出。 srand函数的全部要点是使用随机种子初始化伪随机数序列。 这意味着,如果在两个不同的应用程序(具有相同的srand / rand实现)中将相同的值传递给srand ,则在这两个应用程序中读取的rand()值序列将完全相同。 但是,在您的示例应用程序中,伪随机序列仅包含一个元素-从种子生成的伪随机序列的第一个元素等于1 sec精度的当前时间。 您期望在输出中看到什么? 显然,当您碰巧在同一秒上运行应用程序时-您使用了相同的种子值
  • PHP MySQL分页,随机排序(PHP MySQL pagination with random ordering)
    问题 这是在我的网站上订购搜索结果时出现的问题, 进行搜索时,随机结果会显示在内容页面上,该页面也包括分页。 我将以下用户用作我的SQL查询。 SELECT * FROM table ORDER BY RAND() LIMIT 0,10; 所以我的问题是 我需要确保每次用户访问下一页时,他们已经看到的结果都不会再次出现(以内存高效的方式将它们排除在下一个查询中,但仍按rand()进行排序) 每次访客访问第一页时,都会得到不同的结果集,是否可以对此使用分页,或者排序始终是随机的。 我可以在MYSQL中使用种子,但是我不确定如何实际使用它。 回答1 MySQL中的随机排序是一个棘手的问题。 过去,我通常选择尽可能解决该问题。 通常,用户返回到这样的一组页面的次数不会超过一次或两次。 因此,这使您有机会避免使用各种简单的但并非完全100%的随机解决方案来避免所有令人讨厌的随机顺序实现。 解决方案1 从许多已经建立索引以进行排序的现有列中进行选择。 这可以包括“创建时间”,“修改的时间戳记”或您可以作为排序依据的任何其他列。 当用户第一次来到该站点时,将它们放在一个阵列中,随机选择一个,然后随机选择ASC或DESC 。 在您的情况下,每次用户返回第1页时,请选择新内容并将其存储在会话中。 在随后的每个页面中,都可以使用该排序来生成一致的页面集。 解决方案2 您可以有一个附加列
  • C++ 可预测的 Rand() 输出(C++ Predictable Rand() Output)
    问题 在注意到 rand() 函数每次产生相同的 41 输出后,我使用 srand(time(0)) 为生成器设置种子。 这解决了重复输出的问题,但现在它给了我不断增加的数字。 (即 245、248、250、253、255、256)。 我可以理解它是受系统时间的影响而增加的,但这正常吗? 这是我的程序: #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { int number; srand(time(0)); cout << rand() % 1000; return 0; } 我反复运行它而不是循环。 多次试验的输出:285 295 305 311 325 334 344 354 355 回答1 MS 的 C++ rand()使用最简单的随机生成器 Linear congruential generator 这是它的代码: int __cdecl rand ( void ) { _ptiddata ptd = _getptd(); return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); } 因此,无论何时为函数设置种子,您只需设置第一个值