Nếu bạn muốn kiểm soát chi tiết hơn so với các câu thần chú bash đẹp của maxschlepzig , thì việc viết mã:
#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;
}
Biên dịch với một cái gì đó như gcc randomdelay.c -o randomdelay
và gọi nó như
$ randomdelay 10000 echo Hi!
Nếu bạn đang làm điều này là một bối cảnh lập trình, bạn có thể tốt hơn là chỉ lấy một phần của mã chọn độ trễ ngẫu nhiên cho bạn và gọi một exec
hàm gia đình (cái nào bạn muốn phụ thuộc vào chính xác cách bạn đã chỉ định nội bộ).
Vấn đề ở đây:
- Điều này giả định hệ thống của bạn
rand
/ srand
là lành mạnh (không phải PRNG tốt cho bạn biết rằng họ làm những gì trang nam nói họ làm). Tôi đã gặp một số rắc rối với nó trên hộp Mac OS X của mình, nơi các chức năng đó không được dùng để ủng hộ random
/ srandom
.
- Trong lịch sử, nhiều thực hiện
rand
đã có đặc điểm số kém. Đó không phải là một vấn đề trong ứng dụng này, nhưng nếu có, hãy thay thế nó bằng PRNG tốt hơn.
- Việc xử lý đối số dòng lệnh trong đồ chơi này là một chút nguyên thủy.
- Độ trễ được chọn thống nhất từ một số phạm vi. Đối với một số ứng dụng, bạn có thể thích phân phối không giới hạn như số mũ. Stack Overflow có nhiều câu hỏi về cách nhận phân phối không đồng đều từ các PRNG thống nhất.