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
我有一个随机的 (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