用kdb + q中的随机数更新表

时间:2018-08-03 00:07:00

标签: database kdb

当我运行以下脚本时:

tbl: update prob: 1?100 from tbl;

我期望我会创建一个新列,每一行都有一个随机数。但是,我返回了一个包含表中所有行相同编号的列。

我该如何解决?我需要更新现有表,而不是从头开始创建表。

3 个答案:

答案 0 :(得分:4)

当您使用1?100时,您只要求提供0到100范围内的1个随机值。如果您使用10?100,则会返回0到100之间的10个随机值的列表。

因此要在更新中执行此操作,您要使用类似

tbl:([]time:5?.z.p;sym:5?`3;price:5?10f;qty:5?10)

time                          sym price     qty
-----------------------------------------------
2012.02.19D18:34:27.148501760 gkn 8.376952  9
2008.07.29D20:23:13.601434560 odo 7.041609  3
2007.02.07D08:17:59.482332864 pbl 0.955069  9
2001.04.27D03:36:44.475531384 aph 1.127308  2
2010.03.03D03:35:55.253069888 mgi 0.7663449 6

update r:abs count[i]?0h from tbl

time                          sym price     qty r
-----------------------------------------------------
2012.02.19D18:34:27.148501760 gkn 8.376952  9   23885
2008.07.29D20:23:13.601434560 odo 7.041609  3   19312
2007.02.07D08:17:59.482332864 pbl 0.955069  9   10372
2001.04.27D03:36:44.475531384 aph 1.127308  2   25281
2010.03.03D03:35:55.253069888 mgi 0.7663449 6   27503

请注意,我正在使用short和abs类型返回正值。

答案 1 :(得分:1)

您需要使用rand(time)之类的种子来填充初始数据,否则它将使用相同的种子,并因此给出相同的随机数序列。

编辑:每https://code.kx.com/wiki/Reference/SystemCommands

使用\ S?n,其中n是任何整数。

EDIT2:请访问https://code.kx.com/wiki/Reference/SystemCommands#.5CS_.5Bn.5D_-_random_seed了解如何使用随机数。

答案 2 :(得分:1)

使用count tbl生成与行数一样多的随机数:

首先创建表tbl

tbl:([]date:reverse .z.d-til 100;price:sums 100?1f)

  date       price    
--------------------
2018.04.26 0.2426471
2018.04.27 0.6163571
2018.04.28 1.179559 
..

然后在0到100之间添加一列随机数:

update rdn:(count tbl)?100 from tbl

date       price     rdn
------------------------
2018.04.26 0.2426471 25 
2018.04.27 0.6163571 33 
2018.04.28 1.179559  13 
..

histogram of the generated random numbers between 0 and 100