matthew.j
matthew.j

Reputation: 3

Update table with random numbers in kdb+q

when I run the following script:

tbl: update prob: 1?100 from tbl;

I was expecting that I get a new column created with each row having a random number. However, I get back a column containing the same number for all the rows in the table.

How do I resolve this? I need to update my existing table and not create a table from scratch.

Upvotes: 0

Views: 1649

Answers (3)

JejeBelfort
JejeBelfort

Reputation: 1663

Just generate as many random numbers as you have rows using count tbl:

First create your 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 
..

Then add a column of random numbers between 0 and 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

Upvotes: 1

DanDan4561
DanDan4561

Reputation: 393

When you are using 1?100 you are only requesting 1 random value within the range of 0-100. If you use 10?100, you will be returned a list of 10 random values between 0-100.

So to do this in an update you want to use something like this

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

Note that I am using type short and abs to return positive values.

Upvotes: 4

GokuMizuno
GokuMizuno

Reputation: 543

You need to seed your initial data, using something like rand(time), otherwise it will use the same seed, and thus, give the same sequence of random numbers.

EDIT: Per https://code.kx.com/wiki/Reference/SystemCommands

Use \S?n, where n is any integer.

EDIT2: Check out https://code.kx.com/wiki/Reference/SystemCommands#.5CS_.5Bn.5D_-_random_seed for how to use random numbers, please.

Upvotes: 1

Related Questions