KDB / Q重置新创建的列表上的随机元素(数字与符号/字符)

时间:2015-05-31 18:12:19

标签: list random kdb q-lang nul

我有一个带有( X )元素的随机( Y )列表( 种子 第二维中的元素)我想重置0f和1f之间的随机因子( Z )的值。对于数字列表,此代码可以正常工作

q)seed:20
q){(0>z-(x#seed)?\:1f)*(x#seed)?\:y}[3;10;0.25]

如果像

那样的符号(或字符列表),我怎样才能扩展该代码
q){(0>z-(x#seed)?\:1f)*(x#seed)?\:y}[3;`8;0.25]
q){(0>z-(x#seed)?\:1f)*(x#seed)?\:y}[3;" ";0.25]

我猜中间的乘法是问题,但我不知道如何使它更通用。

也许甚至比这个问题更优雅的解决方案 创建2个列表并像这样处理它。

由于

1 个答案:

答案 0 :(得分:1)

使它成为通用的是使用布尔值进行索引而不是使用它们相乘(就像你现在的那样)。但是,对于非数字列表,您需要将值重置为空值而不是零。这些空值必须是与输入类型相对应的正确null(即int为0Ni,long为0Nj,符号为`,“为chars等) - 这可以通过'first 0#'

所以你的函数的泛型版本应该是这样的:

q){seed cut @[(x*seed)?y;where 0<=z-(x*seed)?1f;:;first 0#y]}[3;10;0.25]
  9 3 9 4 9     9   8 7 6 1   3 4 9 3 9
2 6 5 3 5 6 0 8 9 0   8 9   1 5 7 4 3 2
3 7 6 9 8 2 2 8 9   8 2       5 1 2 1 3

q){seed cut @[(x*seed)?y;where 0<=z-(x*seed)?1f;:;first 0#y]}[3;`8;0.25]
eklinmcm ikfknpam          pjncfmob mmhpkfap                   bhakgffh khkag..
         neohaicn fiajkigo          bllnecdn          hpnommjb pkhpildh lacif..
         feinbhmg mbpkjapc                   dgippbmi lelmkfoe               ..

q){seed cut @[(x*seed)?y;where 0<=z-(x*seed)?1f;:;first 0#y]}[3;" ";0.25]
"rk an i nts d cxfkp "
"oiusc udpliqbqnzapql"
"qhk yauhroflprr lwuw"

话虽如此,这可能不是解决最初问题的最佳方式 - 这只是建议使其成为通用的。

PS。如果你仍然想在数字列表中使用零,那么使用零填充

q)0^{seed cut @[(x*seed)?y;where 0<=z-(x*seed)?1f;:;first 0#y]}[3;10;0.25]
7 0 5 1 1 0 3 2 0 0 0 0 0 3 0 9 7 9 7 7
6 9 4 0 4 4 0 6 2 9 5 1 0 0 8 9 6 3 4 0
5 0 8 1 1 6 4 9 0 1 9 5 8 9 0 3 9 0 0 1