如何在串口中生成随机负整数和正整数的文件?

时间:2009-04-07 17:26:22

标签: language-agnostic bash random awk

我想要一个随机生成的正或负序列整数的文件。现在,我要求文件大致包含(不需要保证)相等数量的负数和正数,但可以在以后更改比例。通过“连续”,我的意思是第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,我将无法分析排序的行为或判断是否保留了稳定性。

6 个答案:

答案 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的跟踪器整数乱序。