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

ash*_*ley 0 language-agnostic random bash awk

我想要一个随机生成的正或负序列整数的文件.现在,我要求文件大致包含(不需要保证)相等数量的负数和正数,但可以在以后更改比例."串行"是指第k个随机负数等于-k,第k个随机正数等于+ k.

这个GNU Bash脚本单行将满足文件格式,但不会是随机的.

$ seq -1 -1 -5 && seq 1 5
-1
-2
-3
-4
-5
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

这个例子显示了我正在寻找的更好的东西,但仍然不是随机的,因为整数在负面和正面之间可预测地交替.

$ paste <(seq -1 -1 -5) <(seq 1 5) | tr '\t' '\n'
-1
1
-2
2
-3
3
-4
4
-5
5
Run Code Online (Sandbox Code Playgroud)

通过shuf命令发送其中一个使它们随机为负或正,但它们会失去连续性.

$ paste <(seq -1 -1 -5) <(seq 1 5) | tr '\t' '\n' | shuf
-5
4
3
2
-2
1
-1
-4
5
-3
Run Code Online (Sandbox Code Playgroud)

注意:我正在尝试测试对列表/位数组(零和1)进行排序的算法,但如果我使用0和1,我将无法分析排序的行为或判断是否保留了稳定性.

dao*_*oad 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";
Run Code Online (Sandbox Code Playgroud)

更新:

要改变比例,我会这样做:

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--;
    }

}
Run Code Online (Sandbox Code Playgroud)

get_list_generator()函数返回一个闭包.这样,您甚至可以同时使用多个列表生成器.