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个字节,但事实并非如此。