我想要一个随机生成的正或负序列整数的文件。现在,我要求文件大致包含(不需要保证)相等数量的负数和正数,但可以在以后更改比例。通过“连续”,我的意思是第k个随机负数等于-k,第k个随机正数等于+ k。
这个GNU Bash脚本单行将满足文件格式,但不会是random。
$ seq -1 -1 -5 && seq 1 5
-1
-2
-3
-4
-5
1
2
3
4
5
这个例子显示了我正在寻找的更好的东西,但仍然不是随机的,因为整数在负面和正面之间交替预测。
$ paste <(seq -1 -1 -5) <(seq 1 5) | tr '\t' '\n'
-1
1
-2
2
-3
3
-4
4
-5
5
通过shuf命令发送其中一个会使它们随机呈现负面或正面,但它们会失去连续性。
$ paste <(seq -1 -1 -5) <(seq 1 5) | tr '\t' '\n' | shuf
-5
4
3
2
-2
1
-1
-4
5
-3
注意:我正在尝试测试对列表/位数组(零和1)进行排序的算法,但如果我使用0和1,我将无法分析排序的行为或判断是否保留了稳定性。
答案 0 :(得分:6)
如果我理解正确,你想要随机交错正整数和负整数。例如:1 2 -1 3 -2 4 5- 3
。
my $count = 10;
my $pos = 1;
my $neg = -1;
my @random = map {
int(rand 2)
? $pos++
: $neg--
} 1..$count;
print "@random\n";
<强>更新强>
要改变比例,我会这样做:
use strict;
use warnings;
my $next = get_list_generator(.5);
my @random = map $next->(), 1..10;
print "@random\n";
my $again = get_list_generator(.25);
my @another = map $again->(), 1..10;
print "@another\n";
sub get_list_generator {
my $prob_positive = shift;
my $pos = 1;
my $neg = -1;
return sub {
return rand() <= $prob_positive ? scalar $pos++ : scalar $neg--;
}
}
get_list_generator()
函数返回一个闭包。这样你甚至可以同时拥有多个列表生成器。
答案 1 :(得分:3)
让我们开始高尔夫比赛? (44)
perl -le'print rand>.5?++$a:--$b for 1..10'
修改:daotoad's 40个字符版本
seq 1 10|perl -ple'$_=rand>.5?++$a:--$b'
答案 2 :(得分:2)
15
是生成的数字总数,tp
是您想要的正数(有效地表示pos / neg的比率):
tp=8
unset p n
for i in $(printf '%s\n' {1..15} | gsort -R); do
(( i <= tp )) && \
echo $((++p)) || \
echo $((--n))
done
答案 3 :(得分:1)
#!/bin/bash
pos=0 neg=0
for i in {1..10}
do
if (( ($RANDOM > 16384 ? ++pos : --neg) > 0 ))
then echo $pos
else echo $neg
fi
done
我不太适合这种单线。还有其他人吗?
编辑:啊,一个单行,65个字符(如果你在同一个shell中反复调用它,需要设置a和b):
a=0 b=0;for i in {1..10}; do echo $(($RANDOM>16384?++a:--b));done
答案 4 :(得分:0)
这是一个受lhunath和Brian的答案启发的Bash单线(2?)。
RANDOM=$$; pos=1; neg=-1; for i in {1..10}; do \
echo $(( $(echo $RANDOM / 32767 \> 0.5 | bc -l) ? pos++ : neg-- )); done
这是一个在高尔夫比赛中竞争的Awk脚本(44)。
seq 1 10|awk '{print(rand()>0.5?++p:--n);}'
这是更清晰的惯用方式:
seq 1 10 | awk 'BEGIN{srand(); pos=1; neg=-1;}
{print (rand() > 0.5 ? pos++ : neg--);}'
答案 5 :(得分:-1)
没有符合您所有标准的数字。你不能说你想要随机但同时说第k个负值== -k和第k个正值== k。您可以随意使用它。
至于你想要做什么,为什么不将这两个问题分开并测试类似整数长度n对的数组。该对中的第一个可以是零或1,并且该对中的第二个将是您的稳定性跟踪器(仅从0到n的计数)。
生成您想要的0和1的列表并随机播放它们然后添加跟踪器整数。现在按照第一个元素对对进行排序。
您的排序输入看起来像这样。
0, 1
1, 2
0, 3
1, 4
1, 5
0, 6
0, 7
1, 8
1, 9
1, 10
0, 11
0, 12
0, 13
稳定的排序会产生这个
0, 1
0, 3
0, 6
0, 7
0, 11
0, 12
0, 13
1, 2
1, 4
1, 5
1, 8
1, 9
1, 10
不稳定的会产生0和1的跟踪器整数乱序。