MATLAB,30个字节
@(a)datasample(repelem(n,n),1)
假定使用MATLAB R2015a或更高版本,并且安装了Statistics&Machine Learning工具箱。
有关repelem
用法,请参见以下说明。较短的代码与下面的代码之间的区别在于,S&ML工具箱包含的函数datasample
可用于从数组中随机(以均等概率)获取一个或多个元素,从而允许使用匿名函数,从而删除了input/disp
电话。
MATLAB,49字节
n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))
此代码假定repelem
在引入函数时即使用MATLAB R2015a或更高版本。repelem
是具有两个参数的函数,第一个是要复制的数字数组,第二个是应复制对应元素多少次的数组。本质上,该函数通过提供数字和游程长度来执行游程长度解码。
通过为两个输入提供相同的输入,repelem
我们得到一个数组,如果有意义的话,该数组包含n倍于元素n。如果您提供,[1 2 3]
您将得到[1 2 2 3 3 3]
。如果您提供,[1 2 4 2]
您将得到[1 2 2 4 4 4 4 2 2]
。这样做意味着如果我们选择一个具有均等概率的元素(以均等概率randi(m)
给出从1到m的随机整数),则每个元素n的被选概率都高出n倍。在的第一个示例中[1 2 3]
,1
机会为1/6,机会2
为2/6,机会3
为3/6。
附带说明一下,由于repelem
尚不支持Octave,因此无法提供TIO链接。此外,因为倍频不能使用有一个大字处罚input()
和disp()
需要被用来作为一个匿名函数是不可能的。如果支持Octave repelem
,则可以使用以下内容:
@(n)a(randi(nnz(a=repelem(n,n))))
那会节省16个字节,但事实并非如此。