一些rand()的测试

Posted alloverzyt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些rand()的测试相关的知识,希望对你有一定的参考价值。

rand()生成的伪随机数已经足够我们实用,为了跟好的理解rand()跟seed的关系,做了一些测试!

rand()函数种子默认为1,在每一次程序运行中,随机数相同,在一次运行中,可将生成数看做随机

#include<bits/stdc++.h>
using namespace std;
int main()
	for(int i=1;i<=10;i++)
		int n=rand();
		printf("%d ",n);
	
	printf("\\n");
	for(int i=1;i<=10;i++)
		int n=rand();
		printf("%d ",n);
	
	return 0;

同一程序运行两次结果相同,但在同一程序中,同样的调用可以看做随机数
[

加入这一行用时间做随机种子代码后,每次运行产生的随机数不同

srand((unsigned)time(NULL));


ORDER BY RAND() 似乎不是随机的

【中文标题】ORDER BY RAND() 似乎不是随机的【英文标题】:ORDER BY RAND() seems to be less than random 【发布时间】:2012-04-18 12:02:17 【问题描述】:

我有一个相当简单的 SQL (MySQL):

SELECT foo FROM bar ORDER BY rank, RAND()

我注意到当我刷新结果时,随机性很弱。

在目前的样本数据中,有六个排名相同(整数零)的结果。有很多随机性测试,但这里有一个简单的手动测试:运行两次时,两次运行的第一个结果应该相同,大约有六分之一的时间。这肯定不会发生,领先的结果至少有三分之一的时间是相同的。

我希望排列均匀分布。我不是专业的统计学家,但我很确定ORDER BY RAND() 应该能做到这一点。我错过了什么?

对于 MySQL,SELECT rand(), rand() 显示两个不同的数字,所以我不买“每次查询一次”的解释

【问题讨论】:

哪个平台?另外:请提供代码 sn-p,演示此行为。 【参考方案1】:

RAND() is only executed once per query.您可以通过查看结果集来验证这一点。

如果您想获得随机顺序,您应该使用NEWID()CHECKSUM(NEWID())

WITH T AS ( -- example using RAND()
  SELECT 'Me' Name UNION SELECT 'You' UNION SELECT 'Another'
)
SELECT Name, RAND()
FROM T;

WITH T AS ( -- example using just NEWID()
  SELECT 'Me' Name UNION SELECT 'You' UNION SELECT 'Another'
)
SELECT Name, NEWID()
FROM T;

WITH T AS ( -- example getting the CHECKSUM() of NEWID()
  SELECT 'Me' Name UNION SELECT 'You' UNION SELECT 'Another'
)
SELECT Name, CHECKSUM(NEWID())
FROM T;

【讨论】:

你假设 SQL Server?我认为他们必须在 MySQL 上,否则他们每次都会得到相同的排序。 @MartinSmith 我添加了链接,而不是 Yuck,所以这是我的假设。 @MartinSmith 公平地说,这也是我的假设。毕竟,我指的是 MSSQL 独有的内置函数。 @Jason 是的,是的。当专门使用 MS SQL Server 时,这是一种公认​​的做法。 ***.com/questions/4979799/… 请参阅 Martin Smith 对此主题的回答,以及无数其他提倡相同的文章。 @Jason - 那你会用什么? (2008 年CRYPT_GEN_RANDOM 可用,但假定为以前的版本)【参考方案2】:

RAND() 不能为每一行刷新。一个可能的解决方案可能是:

SELECT foo FROM bar ORDER BY rank, CHECKSUM(NEWID())

【讨论】:

不! NEWID 对于唯一值,唯一不等于随机。 CHECKSUM 用于平衡哈希表,而不是用于生成随机值。不能保证其中任何一个都是随机的。不不不!

以上是关于一些rand()的测试的主要内容,如果未能解决你的问题,请参考以下文章

测试 PRNG 的质量

MySQL使用rand 随机查询记录效率测试

470. 用 Rand7() 实现 Rand10()

数据结构与算法之深入解析“用Rand7()实现Rand10()”的求解思路与算法示例

ORDER BY RAND() 似乎不是随机的

srand()与rand()生成随机数