Postgresql中的高斯随机分布

SCO*_*SCO 6 random postgresql statistics gaussian

我有一个表格,比方说250个网址:

create table url (
  id serial,
  url varchar(64)
)
Run Code Online (Sandbox Code Playgroud)

这些URL分别对应于网站.每个网站都有不同的受欢迎程度.比方说,在id=125(集中于高斯一)是最流行的,那些在id=1或者id=250是最流行的.

我想在"url"表中提供的"log"表格中填充"log"表,其值为url,但考虑到不同的URL可能更频繁地出现(例如,id为125的url url将是最受欢迎).

create table log (
  id serial,
  url_id integer
)
Run Code Online (Sandbox Code Playgroud)

我想避免使用,random()因为它是统一的而不是非常"真实".

如何用Postgresql实现这一目标?

Fab*_*cke 9

我正在寻找一种根据高斯分布生成数字的方法,并首先发现这篇文章.这就是为什么我分享我刚才发现的东西:

至少从PostGreSQL 8.4开始,还有一个名为tablefunc的附加模块(http://www.postgresql.org/docs/9.2/static/tablefunc.html).

它提出了一个函数normal_rand(n,mean,stddev),使用高斯分布生成n个伪随机数(因此该函数返回一组值,通常在FROM子句中使用).但是,如果将n设置为1,则可以将其用作返回值而不是一组值的函数.

考虑到包含10条记录的表nb10,以下两个查询返回一组10个伪随机数,遵循标准高斯分布(mean = 0,stddev = 1)

SELECT normal_rand(1, 0, 1) FROM nb10;
Run Code Online (Sandbox Code Playgroud)

SELECT * from normal_rand(10, 0, 1);
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助将来的任何人...... :-)

要具体回答您的问题,您可以使用以下内容:

SELECT floor(random_rand(1, 0, 1) * 250 + 125);
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用此查询可以获得不在[0,249]范围内的答案.你可以举个例子:

  • 使用递归查询,我觉得有点矫枉过正,用于丢弃不在[0,249]范围内的值,或者
  • 选择进入宿主语言的循环,只有当它在[0,249]或的范围内时才接受该值
  • 使用模运算符保持在[0,250 [范围,我认为这是最好的解决方案,虽然它稍微改变了高斯曲线.这是我建议你使用的最终查询(modulo/+/modulo技巧是因为-x modulo y和xa正数在PostGreSQL中给出一个负数,这不是坏事:p):

    SELECT ((floor(normal_rand(1,0,1)*250 + 125)::int % 250) + 250) % 250 as v;
    
    Run Code Online (Sandbox Code Playgroud)


use*_*977 8

范围[0,1]上的12个均匀分布的总和是对在[0,12]范围内界定的高斯分布的良好近似.然后可以通过乘以常数然后加/减常数来轻松地重新缩放.

select
    random() + 
    random() + 
    random() +
    random() + 
    random() + 
    random() +
    random() + 
    random() + 
    random() +
    random() + 
    random() + 
    random();
Run Code Online (Sandbox Code Playgroud)

http://books.google.com/books?id=EKA-yeX2GVgC&pg=PA185&lpg=PA185&dq=%22sum+of+12+uniform+random+variables%22&source=bl&ots=YfwwE0fBB3&sig=HX9J9Oe6x316kVL8uamDU_GOsn4&hl=en&sa=X&ei=bJLZUur1GozaqwGHm4DQDQ&ved=0CEUQ6AEwAw #v = onepage&q =%22sum%20of%2012%20uniform%20random%20variables%22&F =假

  • 我接受了这个,因为我发现它是最简单、最优雅的方式,无论使用什么语言。感谢所有其他贡献者。 (2认同)