首页 > 解决方案 > 在 J lang 中使用不那么简单的随机生成

问题描述

我正在尝试使用 J 进行随机生成,并且会出现几个问题:

  1. 如果我想随机选择 10 个字符的单词,我可以使用
   (?10 # 26) { 'abcdefghijklmnopqrstuvwxyz'
vqdffhrvso

选择其中 N 个的最佳方法是什么?例如,三个 10 个字符的单词?

  1. 深入示例 1. 非重复拣选怎么样?以上是重复挑选。

  2. 我可以选择如下的 4 位数字

(?5 # 10) { '0123456789'
40400

(a) 如何潜行一个 0 不能是第一位数字的条件?(b) 怎么说,例如我想从 <1234,1250> UNION (9999, 10002> 中选择自然数?(c) 如何在同一个集合中选择实数?

  1. 扩展点3。知道概率权重分别为0.1、0.3、0.5、0.1,如何从1、3、6、10中随机选择?

  2. 如何为任何分配选择号码?

提前感谢您的反馈!

标签: j

解决方案


选择其中 N 个的最佳方法是什么?

这里有两种方法:

   ]alfa =: a. {~ (a.i.'a')+i.26
abcdefghijklmnopqrstuvwxyz
   rand =: alfa {~ ] ?@$ #@alfa
   rand 10
kuipaajyvm
   rand 3 10  NB. generate a 2d array of indices into alfa (rand called 1x)
zlqtjfcurj
odzdfcuqiy
mjmrylxpau
   rand&10"0 i.3  NB. generate three lists of indices (rand called 3x)
akfklfxuit
scqehljoah
pcptwgqdmm

不重复采摘怎么办?

双子座?提供不重复。您在上面使用的是?针对参数列表的单子。

   sel =: alfa {~ (#alfa) ?~ ]
   sel&10"0 i.5
ysxagmekid
wbdqzkanum
wynmjuvcti
arhwqpegou
ofjigrctdn
   sel 30   NB. impossible
|domain error: sel
|       sel 30

如何潜入一个 0 不能是第一位数字的条件?

  1. 与其余数字分开生成第一个数字
  2. 不断生成答案,直到满足条件
   NB. option 1
   number =: 10 #. (>:@? bind 9) , (10 ?@$~ <:)
   number 3
212
   +/ 99 < (number bind 3)"0 i.1e4
10000

   NB. option 2
   number =: 10 #. 10 ?@$~ ]
   number 3
831
   +/ 99 < (number bind 3)"0 i.1e4  NB. some results with leading 0
8988

   NB. fold single, an infinite loop with a break
   goodnumber =: {{ (10^y-1)&{{y[1 Z: x <: y}} F. (number bind y) '' }}
   goodnumber 3
912
   +/99 < (goodnumber bind 3)"0 i.1e4  NB. no bad results
10000

概率权重

https://code.jsoftware.com/wiki/Fifty_Shades_of_J/Chapter_14

为任何分配选择一个数字

看着load 'stats/base/random'


推荐阅读