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



我有一个随机的(Y)列表,其中包含(X)元素(seed元素在第二次元),我想在一个随机因子(Z)上重置值,该值介于0f和1f之间。对于数字列表,这段代码工作得很好

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]

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

也许有一个更优雅的方法来解决这个问题创建两个列表并像这样处理它

谢谢

要使其泛型,将使用布尔值进行索引,而不是使用它们进行乘法(就像您目前所做的那样)。但是,对于非数值列表,您需要将值重置为空而不是零。这些空必须是与输入类型相对应的正确空(例如,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"

话虽如此,这可能不是解决初始问题的最佳方法——这只是使其一般化的一个建议。

p。如果您仍然希望数字列表为零,则使用zero-fill

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

最新更新