Использование / dev / random, / dev / urandom для генерации случайных данных

Используйте это для вывода списка доступных пакетов:

apk search --update 'node*'

выберите один и установите его следующим образом:

apk add nodejs-lts --update

(1/4) Installing libgcc (5.3.0-r0)
(2/4) Installing libstdc++ (5.3.0-r0)
(3/4) Installing libuv (1.9.1-r0)
(4/4) Installing nodejs-lts (4.4.4-r0)
19
11.03.2016, 00:19
4 ответа

Вы можете использовать od , чтобы получить числа из ] / dev / random и / dev / urandom .

Например,

2 байтовых десятичных целых числа без знака,

$ od -vAn -N2 -tu2 < /dev/urandom
24352

1 байтовое десятичное целое число со знаком,

$ od -vAn -N1 -td1 < /dev/urandom
-78

4 байта без знака десятичные целые числа,

$ od -vAn -N4 -tu4 < /dev/urandom
3394619386

человек od для получения дополнительной информации о od .

28
20.08.2021, 12:11

Некоторые оболочки (например, bash (1) ) имеют "переменную" $ RANDOM , которая дает случайные числа.

11
20.08.2021, 12:11

Вы можете сделать что-то вроде:

perl -le '
  while (q(
    c char,  C unsigned char, s! short, S! unsigned short,
    i! int,  I! unsigned int, l! long,  L! unsigned long,
    f float, d double,) =~ /(\S+) (.*?),/gs) {
    $size = length(pack $1, 0);
    sysread STDIN, $data, $size;
    print "$2($size): " . unpack($1, $data);
  }' < /dev/urandom

Что в 64-битной системе даст вам что-то вроде:

char(1): -98
unsigned char(1): 62
short(2): -12526
unsigned short(2): 399
int(4): 499066219
unsigned int(4): 2312134917
long(8): -4889591208978026255
unsigned long(8): 2080566823379835456
float(4): 55.4727554321289
double(8): 8.6395690272822e-05
3
20.08.2021, 12:11

Гораздо эффективнее работать со встроенными -модулями Bash, чем использовать внешние команды, такие как od. Вот, например, как вы можете получить 60 -битное случайное число:

((RND=((RANDOM<<15|RANDOM)<<15|RANDOM)<<15|RANDOM))

Это даст случайное число в диапазоне от 0 до 1 152 921 504 606 846 975. Вы можете масштабировать это с делением по модулю до любого диапазона, который вы хотите.

В качестве практического примера, скажем, я хочу прочитать один случайный сектор с моего жесткого диска, чтобы вывести диск из состояния ожидания. Я могу это сделать:

#!/bin/bash
DEV=/dev/sda  # Let's say that this is the device we want to spin up.

# Get the device geometry...
read -d- SIZE64 BS <<<$(blockdev --getsize64 --getbsz $DEV)
((SECTORS=SIZE64/BS)) # The total number of $BS-sized sectors on that device.

((RND=(RANDOM<<15|RANDOM)<<15|RANDOM)) # Generate a 45-bit random number.
((SECT=RND%SECTORS)) # The random sector that we will now read...

dd if=$DEV of=/dev/null bs=$BS skip=$SECT count=1 >/dev/null 2>&1

Готово.

(Примечание :В этом примере я решил, что 45 -битного случайного числа будет более чем достаточно, а также немного быстрее, чем 60 -бит.)


Обновление:

В качестве количественного подтверждения приведенного выше заявления о скорости:


~# time for i in {1..10000} ;do RND=$(od -An -N7 -tu8 /dev/urandom) ;done

real    0m45.647s
user    0m17.540s
sys     0m28.807s

~# time for i in {1..10000} ;do ((RND=((RANDOM<<15|RANDOM)<<15|RANDOM)<<15|RANDOM)) ;done

real    0m0.112s
user    0m0.105s
sys     0m0.007s

5
20.08.2021, 12:11

Теги

Похожие вопросы