用 kdb+q 中的随机数更新 table
Update table with random numbers in kdb+q
当我运行以下脚本时:
tbl: update prob: 1?100 from tbl;
我原以为我会创建一个新列,每行都有一个随机数。但是,我得到一个列,其中包含 table.
中所有行的相同编号
我该如何解决这个问题?我需要更新我现有的 table 而不是从头开始创建 table。
您需要使用 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 如何使用随机数。
当您使用 1?100 时,您只请求 0-100 范围内的 1 个随机值。如果你使用 10?100,你将 returned 一个 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 类型用于 return 正值。
只需使用 count tbl
:
生成与行数一样多的随机数
首先创建你的 table 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
..
当我运行以下脚本时:
tbl: update prob: 1?100 from tbl;
我原以为我会创建一个新列,每行都有一个随机数。但是,我得到一个列,其中包含 table.
中所有行的相同编号我该如何解决这个问题?我需要更新我现有的 table 而不是从头开始创建 table。
您需要使用 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 如何使用随机数。
当您使用 1?100 时,您只请求 0-100 范围内的 1 个随机值。如果你使用 10?100,你将 returned 一个 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 类型用于 return 正值。
只需使用 count tbl
:
首先创建你的 table 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
..