在 J 中生成具有重复值的随机整数数组

Generate a random integer array with repeating values in J

我想生成一个具有重复值的随机数组。像这样:

4 11 6 3 5 4 16 11 26 5 4

我知道语句 12 ? 50 将生成一个随机整数数组,其中包含 12 个 唯一 值,范围为 0 到 49。我如何允许重复值?

J 也可以创建随机浮点数组吗?

NuVoc 在'Use These Combinations'下?'s documentation告诉你:

   5 ?@$ 10
3 3 7 7 0
   5 ?@$ 10
6 7 6 6 9

这与

具有相同的效果,但性能更高
   ? 5 $ 10
6 1 1 8 9
   ? 5 $ 10
5 9 7 2 9

哪个当然会构建一个包含五个 10 的数组然后应用?给他们每个人从 0..9 中得到一个随机数,独立于其他结果。

And can J create floating point arrays.

完全错过了这个问题。是的,您可以像处理任何其他类型的数组一样执行此操作。

   datatype 1 2 3
integer
   datatype 1.1 2.2 3.3
floating

Roll (?) 是否会给出重复值取决于其参数的比率。如果可重复性要求是可选的,那么只需使用 Roll。如果是强制性的,那么首先使用 Roll 获取唯一值,然后分配该值以获得所需的长度。

J Vocabulary for Roll says如何获取随机浮点数:

   ? 0      NB. as a scalar
0.331228
   ] r=. 5 ?@$ 0  NB. as an array of shape x (which is 5 here)
0.331228 0.905526 0.71756 0.637666 0.486918

然后可以通过算术运算符将其缩放到所需的范围,例如开区间 (3,26):

   ] s=. 3 + (26-3) * r
10.6182 23.8271 19.5039 17.6663 14.1991

或通过Polynomial (p.):

   ] s=. (3 , 26-3) p. r
10.6182 23.8271 19.5039 17.6663 14.1991

然后可以分配到最终长度(比如,8):

   (8 ?@$ 5) { s
10.6182 14.1991 17.6663 10.6182 17.6663 17.6663 23.8271 19.5039