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实现这一目标?
我正在寻找一种根据高斯分布生成数字的方法,并首先发现这篇文章.这就是为什么我分享我刚才发现的东西:
至少从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,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)范围[0,1]上的12个均匀分布的总和是对在[0,12]范围内界定的高斯分布的良好近似.然后可以通过乘以常数然后加/减常数来轻松地重新缩放.
select
random() +
random() +
random() +
random() +
random() +
random() +
random() +
random() +
random() +
random() +
random() +
random();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3760 次 |
| 最近记录: |