0

我有一个带有 ( 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 个列表并像那样处理它更优雅的解决方案。

谢谢

4

1 回答 1

1

为了使其通用,将是使用布尔值来索引而不是使用它们来乘法(就像你现在一样)。但是,对于非数字列表,您需要将值重置为空值而不是零。这些空值必须是与输入类型相对应的正确空值(即 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
于 2015-06-01T10:06:40.860 回答