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

KDB / Q Resetting random elements on newly created list (numerical vs symbol/char)

我有一个随机的 (Y) 列表,其中包含 (X) 个元素 ( seed 第二维元素),我想在其中重置 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 个列表并像那样处理它。

谢谢

要使其通用化,需要使用布尔值进行索引,而不是使用它们进行乘法运算(如您目前所做的那样)。但是,对于非数字列表,您需要将值重置为空而不是零。这些空值必须是与输入类型相对应的正确空值(即 0Ni 表示整数,0Nj 表示长整数,` 表示符号," " 表示字符等)- 这可以通过 '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