Unix nawk中for循环中的rand()始终返回相同的值-ksh

Unix nawk中for循环中的rand()始终返回相同的值-ksh,unix,for-loop,random,awk,ksh,Unix,For Loop,Random,Awk,Ksh,我现在为这件事烦恼了太多时间 我想在一个数组中添加1000随机数,这是我到目前为止所做的,它可以正常工作,但rand始终在经过的数组中分配相同的数。随机数的变化,我希望它是从1到999。。。你知道怎么回事吗 顺便说一句,我在ksh跑步 nawk ' BEGIN{ for (i=0; i<=999; i++) { srand() NUMBERS[i]= int(rand()*(999)) print NUMBERS[i] }

我现在为这件事烦恼了太多时间

我想在一个数组中添加
1000
随机数,这是我到目前为止所做的,它可以正常工作,但rand始终在经过的数组中分配相同的数。随机数的变化,我希望它是从1到999。。。你知道怎么回事吗

顺便说一句,我在ksh跑步

nawk  ' BEGIN{ 
    for (i=0; i<=999; i++) {
        srand()
        NUMBERS[i]= int(rand()*(999))
        print NUMBERS[i]
    }
}'
nawk'开始{

对于(i=0;i将
srand()
没有任何参数,使用当前时间戳作为种子,循环可能恰好使用相同的种子值。因此,您看到的是相同的数字。

该死的我..这就是错误所在?难以置信…请用代码检查更新的帖子,我将srand放在循环之外,如果我添加值1是否错误?我用它来表示,即1是起始值。对,时间戳分辨率以秒为单位,因此只要所有迭代都发生在同一个1秒窗口内,循环每次都会产生相同的值。如果当前时间在循环运行时正好从12:00:01交叉到12:00:02或类似时间,则会得到2个值。@hedgehog-移动srand()在循环之外是正确的做法,但使用硬编码的种子值1等于否定了使用srand()的全部意义,即在每次调用脚本时为rand()获取一个新的种子值(只要调用间隔为1秒或更长)。这本身并不是“错的”(使用相同的固定种子)。但对于相同的种子值,rand()将产生完全相同的数字序列。例如,使用
srand(1)
,您始终会得到相同的数字集(现在、明天、明年等)。通常,这就是为什么时间被用作种子,这对于大多数应用程序来说是相当好的种子。是的,您错了。它是rand()的种子值,所以它是something rand()在生成下一个随机数时用作“上一个值”。从功能上讲,这与根本不调用srand()没有区别,因为每次调用awk脚本时,rand()都会生成相同的“随机”数。rand()始终输出一个
=0
<1
的值,以便生成介于1和999之间的随机整数是
srand();print int(1+rand()*999)
。无需引入延迟,只需使用$random或类似的值而不是当前纪元时间,例如
awk-v seed=“$random”BEGIN{srand(seed)…
。此:
int(rand()*(999))
将为您提供从0到998的数字,顺便说一句,而不是您所说的从1到999的数字。请重新阅读我上面的评论,了解如何执行您所说的操作。
nawk  ' BEGIN{ 
    srand(1)
    for (i=0; i<=999; i++) {
        NUMBERS[i]= int(rand()*(999))
        XNUMBERS[i]= int(rand()*(999))
        print NUMBERS[i]
        print XNUMBERS[i]
    }
}'
NUMBERS=`nawk ' BEGIN{ 
    srand()
    for (i=0; i<=999; i++) {
        printf("%s\n", 100 + int(rand() * (899)));
    }   
}'`
NUMBERS
#echo $NUMBERS
XNUMBERS=`nawk ' BEGIN{ 
    srand()
    for (i=0; i<=999; i++) {
        XNUMBERS[i]= 100 + int(rand() * (899));
    }
    for (i=0; i<=999; i++) {
        ver=XNUMBERS[i] "";
                rev = "";
        for (q=length(ver); q!=0; q--) {
                rev = rev substr(ver, q, 1);
               }
        printf("%s\n", XNUMBERS[i] "|" rev );
    }
}'`