Se você quiser um controle mais refinado do que os agradáveis encantamentos do maxschlepzig , é uma coisa razoavelmente fácil de codificar:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
int main(int argc, char**argv){
useconds_t mdelay=0, delay;
if (argc<3){
fprintf(stderr,"%s <delay (in milli-seconds)> <command> <args>* :\n\trun commands with a random delay\n",argv[0]);
exit(1);
}
mdelay=atol(argv[1]);
/* seed random number generator with the time */
srand(((unsigned int)time(NULL))%RAND_MAX);
delay = mdelay * (rand() / (1.0 + RAND_MAX));
usleep(delay*1000);
execvP(argv[2],getenv("PATH"),argv+2);
return 0;
}
Compile com algo como gcc randomdelay.c -o randomdelay
e chame como
$ randomdelay 10000 echo Hi!
Se você estiver fazendo isso é um contexto de programação, talvez seja melhor pegar a parte do código que escolhe o atraso aleatório para você e chama uma função exec
family (qual deles você quer depende exatamente de como você especificado internamente).
Emitir aqui:
- Isso pressupõe que seus sistemas
rand
/srand
sejam sãos (não é bom que os PRNGs se importem com o fato de que eles fazem o que a página man diz que eles fazem). Eu tenho tido alguns problemas com isso na minha caixa do Mac OS X, onde essas funções estão obsoletas em favor derandom
/srandom
. - Historicamente, muitas implementações de
rand
tiveram características numéricas ruins. Isso não deve ser um problema neste aplicativo, mas se for, substitua-o por um PRNG melhor. - O argumento de linha de comando usado neste brinquedo é um pouco primitivo.
- O atraso é escolhido uniformemente de algum intervalo. Para algumas aplicações, você pode preferir uma distribuição ilimitada como um exponencial. O Stack Overflow tem muitas perguntas sobre como obter distribuições não uniformes de um PRNG uniforme.