C# 数据库随机抽取数据

C# 数据库随机抽取数据,第1张

我这只是思路啊,这个要实现的话要使用多线程技术

一个线程负责产生随机数与抽取数据

1首先一个随机数

对比内变量里的随机数,是否有重复,如果重复则此次无效,重新生成

2,根据此随机数抽取数据库中数据。

另一个线程负责清空内存变量的数据

即此线程开着一个计时器,然后根据时间来清除数据

希望对你有所帮助

/

  MySQL 随机取记录

  

  @param $t 表

  @param $c ID列,默认为id

  @param $n 取多少个

  @param $w 条件语句

  @param $f bool 是否强制以多维数组形式返回,默认false

  @return array 取1个直接返回结果数组(除非$f为true),取>1个返回多维数组,用foreach取出

 /

function rand_row($t , $c = 'id' , $n = '1', $w = '' , $f = false) {

$m=new mysqli(mysqli信息,自行查找php文档);

if (!empty($w)) {

$w = ' AND '$w;

}

$sql = "SELECT  FROM `{$t}` WHERE {$c} >= (SELECT floor(RAND()  (SELECT MAX({$c}) FROM `{$t}`))) {$w} ORDER BY {$c} LIMIT {$n};";

$xq  = $m->query($sql);

$r   = array();

while ($x = $m->fetch_array($xq)) {

$r[] = $x;

}

if ($f == false && count($r) == 1) {

return $r[0];

} else {

return $r;

}

}

一、Oracle取随机数据 1、Oracle访问数据的基本方法: 1)、全表扫描(Full table Scan):执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件。Oracle顺序的读分配给该表的每一个数据块,且每个数据块Oracle只读一次这样全表扫描能够受益于多块读 2)、采样表扫描(sample table scan):扫描返回表中随机采样数据,这种访问方式需要在FROM语句中包含SAMPLE选项或者SAMPLE BLOCK选项 注:从Oracle8i开始Oracle提供采样表扫描特性

2、使用sample获得随机结果集 21、语法: SAMPLE BLOCK [ SEED (seed_value) ] SAMPLE选项:表示按行采样来执行一个全表扫描,Oracle从表中读取特定百分比的记录,并判断是否满足WHERE子句以返回结果。 BLOCK: 表示使用随机块例举而不是随机行例举。 sample_percent:是随机获取一张表中记录的百分比。比如值为10,那就是表中的随机的百分之10的记录。 值必须大于等于000001,小于100。

SEED:表示从哪条记录返回,类似于预先设定例举结果,因而每次返回的结果都是固定的。该值必须介于0和4294967295之间。

22、举例说明

(1)sample(sample_percent):

(2)、sample block(sample_percent)

(3)、sample block(sample_percent) seed(seed_value)

注意以下几点:

1sample只对单表生效,不能用于表连接和远程表 2sample会使SQL自动使用CBO

3、使用DBMS_RANDOM包 DBMS_RANDOM有两种主要的使用方法分别是:DBMS_RANDOMVALUE()和DBMS_RANDOMRANDOM

4、使用 内部函数sys_guid()

注:

在使用sys_guid() 这种方法时,有时会获取到相同的记录,即和前一次查询的结果集是一样的,查找相关资料,有些说是和 *** 作系统 有关,在windows平台下正常,获取到的数据是随机的,而在 Linux 等平台下始终是相同不变的数据集,有些说是因为sys_guid()函数本身的问题,即sys_guid()会在查询上生成一个16字节的全局唯一标识符,这个标识符在绝大部分平台上由一个宿主标识符和进程或进程的线程标识符组成,这就是说,它很可能是随机的,但是并不表示一定是百分之百的这样。

所以,为确保在不同的平台每次读取的数据都是随机的,我们大多采用使用sample函数或者DBMS_RANDOM包获得随机结果集,其中使用sample函数更常用,因为其查询时缩小了查询范围,在查询大表,且要提取数据不是很不多的情况下,会对查询速度上有明显的提高。

公式:(上限 - 下限 + 1 ) * rand() - 下限

介绍:John von Neumann说:Any one who considers arithmetical methods of producing random digits is , of course, in a state of sin

所以,在讨论算法实现随机数的时候,总是说“伪随机数”。

现在,应用最广的随机数生成算法是由Derrick Henry Lehmer1951年给出的线性同余法:

Xn+1 = ( aXn + c ) mod m, n>=0

在上一篇伪随机数的论述中,并没有给出X0, a, c, m的取值规则,只是给出了ANSI C和Microsoft Visual C++的实现。

在这儿我们可以自己先思考一下,我们期望从上式中得到的随机数应该满足:

1) 上式的输出足够随机,这是最基本的要求;

2) 上式给出尽量多的输出,越接近m个越好(不可能超过m),即周期尽量长,最好为m,这样才能保证上式满足均匀分布(m个数在周期m中各出现一次);

3) 上式的生成速度足够快。

最容易想到的,m的取值为计算机字大小(如2^32或2^64)。

但是这儿有个很严重的问题:Xn低位的随机性很弱。原因如下:

令d|m, 且

Yn = Xn mod d

Yn+1 = ( ( aXn + c ) mod m ) mod d

= ( aYn + c ) mod d

上述表达式的意义即:Yn为Xn低k位(d=2^k),这样的Yn序列形成周期为d甚至更短的同余序列。举例说明:d为2^1时,Yn为Xn的最低位(可假定为1或0),若Yn+1 != Yn,则Yn+2 == Yn必定成立,仅当a、c皆为奇数时Yn、Yn+1将0、1交替,否则,为常数(0或1)。

暂时抛开随机性不管,先找到周期为m的随机序列中的取值规则。

Donald Knuth在The Art of Computer Programming, Volume 2: Seminumerical Algorithms中的3212节对m, a, c和X0取值规则的表述:

1) gcd(c, m) = 1 即c, m互素,再白一点,c, m除1之外没有其他公因子;

2) 任给质数p, p|m ==> p|(a-1) 即m%p==0,则(a-1)%p==0。

3) 4|m ==> 4|(a-1) 即m%4==0,则(a-1)%4==0。

这个证明过程对于我这样的数论基础不是很扎实的搞应用技术的人来说有点难以理解了。有兴趣的话,还是去看3212的证明吧:-)。

上面的规则告诉我们,满足了上述规则后,可以保证序列周期为m。对于前面提到的关于随机性的问题,既然Xn低位的随机性比较弱,可以只取Xn的高位作为输出。高位的随机性和统计意义由a, c确定,其取值涉及统计检验,具体的也还是看33吧。

这篇文章解决了具有统计意义的随机数的部分理论问题。

PS: 之前曾经BS过Windows Live Writer,当时觉得Writer编辑功能太少,不能直接设定链接文字的字体颜色,知道CSS可以设定之后,又觉得Word 2007编辑的Blog转成html之后太大,而且也知道Word 2007上面是可以设置链接的target为_blank的。现在发现Writer还是很不错的了,原来是可以设定格式的,也可以直接编辑html,而且可以Web预览,链接还可以加入到链接词汇表,挺方便的。

数据库的随机查询SQL

1 Oracle,随机查询20条

select from

(

select from 表名

order by dbms_randomvalue

)

where rownum <= 20;

2MS SQL Server,随机查询20条

select top 20 from 表名order by newid()

3My SQL:,随机查询20条

select from 表名 order by rand() limit 20

1、首先介绍一下如何用RAND()函数来生成随机数(同时返回多个值时是不重复的)。

如下图所示,在单元格中输入=RAND(),回车后单元格即返回了一个随机数字。

2、RAND()函数返回的随机数字的范围是大于0小于1。因此,也可以用它做基础来生成给定范围内的随机数字。

3、生成制定范围的随机数方法是这样的,假设给定数字范围最小是A,最大是B,公式是:

=A+RAND()(B-A)。

举例来说,要生成大于60小于100的随机数字,因为(100-60)RAND()返回结果是0到40之间,加上范围的下限60就返回了60到100之间的数字。

4、上面RAND()函数返回的0到1之间的随机小数,如果要生成随机整数的话就需要用RANDBETWEEN()函数了,如下图该函数生成大于等于1小于等于100的随机整数。

这个函数的语法是这样的:=RANDBETWEEN(范围下限整数,范围上限整数),结果返回包含上下限在内的整数。注意:上限和下限也可以不是整数,并且可以是负数。

5、RAND()和RANDBETWEEN()是生成随机数的基础函数,也可以灵活变通。比如说要生成001至1之间包含两位小数的随机数,则可用下图的公式实现:

以上就是关于C# 数据库随机抽取数据全部的内容,包括:C# 数据库随机抽取数据、如何在数据库中随机取出1条记录PHP、Oracle 中实现随机抽取数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10155379.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存