Code Golf:MSM随机数生成器

Viv*_*ath 13 language-agnostic random code-golf rosetta-stone

挑战:

使用中间方法生成一系列(伪)随机数的字符数最短的代码.

约翰冯·诺伊曼于1946年首次提出了(伪)随机数生成的中间方法,其定义如下:

R n + 1 = mid((R n)2,m)

例如:

3456 2 = 11943936

mid(11943936)= 9439

9439 2 = 89094721

mid(89094721)= 0947

947 2 = 896809

mid(896809)= 9680

9680 2 = 93702400

mid(93702400)= 7024

另一个例子:

843 2 = 710649

mid(710649)= 106

106 2 = 11236

mid(11236)= 123

123 2 = 15129

mid(15129)= 512

512 2 = 262144

mid(262144)= 621

621 2 = 385641

mid(385641)= 856

856 2 = 732736

mid(732736)= 327

327 2 = 106929

mid(106929)= 069

69 2 = 4761

中(4761)= 476

476 2 = 226576

mid(226576)= 265

定义mid:

显然,对于确切的定义存在一些混淆mid.出于此挑战的目的,假设您正在提取与起始种子相同的位数.意思是,如果起始种子有4位数,你将从中间提取4位数.如果 起始种子有3位数,则从中间提取3位数.

关于在找不到精确中间数时提取数字,请考虑数字710649.如果要提取中间3,则存在一些歧义(106064).在这种情况下,提取最接近字符串开头的3.所以在这种情况下,你会提取106.

想到它的一种简单方法是,如果数字不是正确的数字,则将零填充到数字.例如,如果您将前导零填充到710649,则会得到0710649,而中间的3位数现在变为106.

测试用例:

不要假设种子的长度.例如,您不能假设种子将始终是4位数字

生成4位随机数的3456的起始种子应生成以下系列(前10个):

9439,947,9680,7024,3365,1322,4458,8737,3351,2292

生成4位随机数的8653的起始种子应生成以下系列(前10个):

8744,4575,9306,6016,1922,6940,1636,6764,7516,4902

产生3位随机数的843的起始种子应生成以下系列(前10个):

106,123,512,621,856,327,69,476,265,22

生成5位数的ranom数的45678的起始种子应生成以下系列(前10个):

86479,78617,80632,1519,30736,47016,10504,3340,11556,35411

就前导零而言,答案是不应该显示前导零:).

Dan*_*llo 15

Google文档 - 电子表格:42个字符

=MID(C2^2,LEN(C2^2)/2-LEN(C2)/2+1,LEN(C2))
Run Code Online (Sandbox Code Playgroud)

用法:

  • 将初始种子放入单元格中C2,然后拖动所有序列的公式.

测试用例:

截图:

Code Golf:MSM随机数发生器http://img59.imageshack.us/img59/6830/golfo.png

限制:

  • 此公式保留前导零,但可以使用其他列修剪它们并应用INT()结果.


Car*_*rez 10

dc 26/37 chars

26个单个数字的函数:

?dZsl2^dZ1+ll-2/Ar^/All^%p
Run Code Online (Sandbox Code Playgroud)

带有10个循环循环的37个字符:

?dZsl[2^dZ1+ll-2/Ar^/All^%pdzB>L]dsLx
Run Code Online (Sandbox Code Playgroud)

功能说明:

?            Input n
dZ           calculate number of digits
sl           store in register l
2^           calculate n^2
dZ           calculate number of digits of square
1+ll-2/Ar^/  n/(10^((squaredigits+1-l)/2)) int division truncates last digits 
All^%        n%(10^l) modulus truncates first digits
p            print the number

测试:

dc msml.dc
45678
86479
78617
80632
1519
30736
47016
10504
3340
11556
35411


dou*_*lep 5

Python(86个字符)

r=input()
l=len(str(r))
while 1:
 x=str(r*r)
 y=(len(x)-l)/2
 r=int(x[y:y+l])
 print r
Run Code Online (Sandbox Code Playgroud)

在stdout上产生无限序列.请注意,long由于L表示结束,至少在具有类型的旧版本上,反引号技巧不起作用.Python 3 print作为函数将为关闭paren添加1个char.