[出题]求56以内和为60的5个随机数
发表于 : 2018年11月14日 08:57
求56以内和为60的5个随机数
随机数可以有重复项
要求:输出多个结果,尽可能随机分布。
随机数可以有重复项
要求:输出多个结果,尽可能随机分布。
输出示例:our $R = 56; our $n = 5; # the number you need our $m = 60; grep { test() } (1 .. 10); sub test { my $get; my $left = $m; my @poss; for ( my $t = $n; $t > 1; $t-- ) { $get = int(rand($left-$t))+1; push @poss, $get; $left -= $get; } push @poss, $left; printf "%s\n", join(",", @poss); }
可以看到每一个都有明显特征29,9,15,1,6
32,16,3,4,5
51,2,2,3,2
29,6,13,8,4
38,17,2,1,2
23,13,18,3,3
35,6,1,12,6
45,9,3,1,2
54,1,2,1,2
40,16,1,1,2
输出示例:our $R = 56; our $n = 5; # the number you need our $m = 60; grep { test() } (1 .. 10); sub test { my @cup = (1) x $n ; grep { $cup[int(rand $n)]++ } ( $n+1 .. $m ); printf "%s\n", join(",", @cup); }
这样又显得比较均匀,有没有更随机的?12,10,10,15,13
12,12,15,12,9
12,8,12,15,13
12,14,15,9,10
11,12,13,11,13
10,10,11,10,19
12,10,17,7,14
14,13,10,12,11
13,10,11,12,14
11,8,10,15,16
我和另一个用户 Rubyish 用的是 Perl 语言。our 是一种变量声明,声明这个变量全局的。zzz19760225 写了: 不明觉厉
我以前想过取电脑的系统时间,然后奇偶数判断,选择时间微秒的最后两位之一。
后来因为电脑需要系统权限什么的,没继续折腾(需要一个好折腾的工具和环境)。
our 是什么语言啊
our$有点像linux或服务器
代码: 全选
@echo off & setlocal enabledelayedexpansion & mode 100
for /L %%t in (1 1 20) do (
>nul (for /f "tokens=1 delims==" %%a in ('2^>nul set ##') do set "%%a=")
set "pool="
for /L %%a in (100 1 159) do set "t=%%a" & set "pool=!pool!#!t:~-2!"
set len=60
for /L %%a in (1 1 5) do (
set /a "r = !random! %% len * 3, len-=1"
for %%r in (!r!) do (
set "c%%a=!pool:~%%r,3!"
set "#!pool:~%%r,3!=1"
for %%b in (!c%%a!) do set "pool=!pool:%%b=!"
)
)
set /a "last=0,ind=1"
for /f "tokens=1 delims=#=" %%a in ('set ##') do (
set /a "t=$$!ind!=1%%a-100-last, last=1%%a-100,ind+=1"
if !t! lss 0 (set /a "t+=60, $$!ind!=t")
)
set /a "$$1-=last"
if !$$1! lss 0 (set /a "$$1+=60")
set "out=" & set "sum=0"
for /L %%a in (1 1 5) do (
set "out=!out!!$$%%a! "
set /a "sum+=$$%%a"
)
if !sum!==60 (REM set "out=!out! OK" & REM OK
) else (set "out=!out! ERR")
echo;!out!
)
pause
代码: 全选
33 2 21 2 2
20 5 8 9 18
40 3 1 6 10
17 11 23 2 7
33 5 5 16 1
24 16 2 10 8
29 4 5 1 21
22 14 15 3 6
7 1 1 17 34
35 7 7 7 4
19 11 1 19 10
9 7 1 7 36
34 3 10 6 7
22 1 13 17 7
36 4 7 3 10
13 2 18 18 9
46 4 1 2 7
27 16 2 2 13
5 14 5 27 9
12 7 33 4 4
每个容器每次获得加1的概率为 1/5=20%, 总共55次加1机会, 每个容器均有趋近11(=55/5)次机会, 在大样本统计情况下, 1+11=12 应是频率最高的数字, 偏离 12 越远的数字出现频率都会极低523066680 写了:第二种,假设有n个容器,初始值为1,随机对这些容器 (m-n-1) 次 叠加1 的计算
输出示例:our $R = 56; our $n = 5; # the number you need our $m = 60; grep { test() } (1 .. 10); sub test { my @cup = (1) x $n ; grep { $cup[int(rand $n)]++ } ( $n+1 .. $m ); printf "%s\n", join(",", @cup); }这样又显得比较均匀,有没有更随机的?12,10,10,15,13
12,12,15,12,9
12,8,12,15,13
12,14,15,9,10
11,12,13,11,13
10,10,11,10,19
12,10,17,7,14
14,13,10,12,11
13,10,11,12,14
11,8,10,15,16
代码: 全选
8:2
9:2
10:10
11:6
12:11
13:6
14:4
15:5
16:1
17:1
19:1