Как я могу сгенерировать случайное 64-битное целое число со знаком в macOS?

Мне удалось решить проблему после того, как я вручную установил более старую версию (v1.14.0) libiscsi, где qemu смог найти libiscsi.so.4 файл.

Сначала я удалил v1.17.0-2, установленный с помощью pacman. sudo pacman -Rddn libiscsi без деинсталляции зависимости qemu-block-iscsi.

Я клонировал исходный код с github sahlberg/libiscsi и после сборки установил библиотеку с помощью libtool. Я понимаю, что это не лучшее решение, потому что при следующем обновлении qemu мне придется удалить ручную установку и снова использовать пакет pacman.

На данный момент я вижу, что на странице arch linux qemu-page пакет :

Flagged out-of-date on 2016-05-10 Version 2.6.0-1 in testing

код выполнен от имени root:

# git clone folder - libiscsi/

# Making install in lib
# directory 'libiscsi/lib'

 mkdir -p '/usr/lib'
 /bin/sh ../libtool   --mode=install /usr/bin/install -c   libiscsi.la '/usr/lib'

 libtool --finish /usr/lib

----------------------------------------------------------------------

# Libraries have been installed in: /usr/lib

----------------------------------------------------------------------

# Making install in utils
# directory 'libiscsi/utils'

 mkdir -p '/usr/bin'
 /bin/sh ../libtool   --mode=install /usr/bin/install -c iscsi-inq iscsi-ls iscsi-perf iscsi-readcapacity16 iscsi-swp '/usr/bin'

----------------------------------------------------------------------

# directory 'libiscsi/examples'

 mkdir -p '/usr/bin'
 install -c ld_iscsi.so '/usr/bin'

----------------------------------------------------------------------

# directory 'libiscsi/    

 mkdir -p '/usr/include/iscsi'
 install -c -m 644 include/iscsi.h include/scsi-lowlevel.h '/usr/include/iscsi'
 mkdir -p '/usr/lib/pkgconfig'
 install -c -m 644 libiscsi.pc '/usr/lib/pkgconfig'

Я выполнил команды вручную, потому что по умолчанию make install из libiscsi устанавливал либы в /usr/local/bin и /usr/local/lib.

Любые комментарии и предложения приветствуются!

3
25.12.2016, 01:27
4 ответа

Объедините 2 32-битных целых числа, взятых из /dev/urandom. Должно быть возможно использовать od для захвата одного 64-битного значения согласно ответу Стефана, но по крайней мере на некоторых версиях OS X это не удается без соответствующего сообщения об ошибке.

#!/bin/sh
low32=$(od -An -td4 -N4 < /dev/urandom)
high32=$(od -An -td4 -N4 < /dev/urandom)
long=$(($low32 + ($high32 << 32) ))
3
27.01.2020, 21:12

Вы можете сложить два 32-битных числа вместе, например,

#!/bin/bash
printf '0x%04x%04x\n' $RANDOM $RANDOM
j=$(printf '16#%04x%04x' $RANDOM $RANDOM)
echo $j
echo $(($j))

Образец вывода

0x5e34562d 
16#7cf567f9
2096457721

Это одна из многих функций, зародившихся в оболочке Korn (ksh) и скопированных в bash и zsh несколько лет спустя.

В комментарии - вы можете добавить дополнительные биты:

#!/bin/bash    
printf '0x%04x%04x\n' $RANDOM $RANDOM
foo=32767
printf '%016x\n' $((foo << 49))
printf '%016x\n' $((foo << 34))
printf '%016x\n' $((foo << 19))
printf '%016x\n' $((foo << 4))
printf '%016x\n' $((foo % 16))

printf '%016x\n' $((foo << 49 |
                   (foo << 34) |
                   (foo << 19) |
                   (foo << 4) |
                   (foo % 16)))
printf '%d\n'    $((foo << 49 |
                   (foo << 34) |
                   (foo << 19) |
                   (foo << 4) |
                   (foo % 16)))

Пример вывода:

0x3a1e1184     
fffe000000000000
0001fffc00000000
00000003fff80000
000000000007fff0
000000000000000f
ffffffffffffffff
-1
-2
27.01.2020, 21:12

Как и в macOS / dev / urandom , вы должны иметь возможность:

od -An -vtd8 -N8 < /dev/urandom

Однако, по словам тех, кто пробовал это в реальной системе macOS (см. комментарии), там это не работает. Поскольку macOS должна быть сертифицированной системой Unix, это означает, что это ошибка, поскольку POSIX четко определяет поведение этой команды . Единственное, что POSIX оставляет неопределенным (определяемым реализацией), является порядок байтов (о котором мы не заботимся здесь, поскольку это все случайные байты).

В качестве альтернативы вы можете использовать ksh / bash / zsh $ RANDOM здесь. Несмотря на то, что macOS sh в настоящее время основан на bash , было бы лучше переключиться на реализации bash / zsh (или ksh , отличные от mksh , чья арифметика использует 32 бита) как $ RANDOM не является функцией sh , поэтому может не работать в будущей версии macOS, если они решат переключиться на другую оболочку.

m=32768 # $RANDOM span
long=$((RANDOM+RANDOM*m+RANDOM*m*m+RANDOM*m*m*m+RANDOM*m*m*m*m))

или:

long=$((RANDOM|(RANDOM<<15)|(RANDOM<<30)|(RANDOM<<45)|(RANDOM<<60)))

Это 5 * 15 == 75 бит, но это будет усечено оболочкой до 64 бит.

В инструментарии POSIX для генерации случайных чисел используется метод awk rand () , поэтому вы можете сделать:

awk 'BEGIN{srand(); printf "%.20g\n", rand() * (2^64) - (2^63)}'

Но будьте осторожны со многими awk (те, которые основывают семя srand () на результате time (3) ), вы получите тот же результат, если запустите его дважды в ту же секунду.

Кроме того, из-за способа представления чисел с плавающей запятой я ожидал, что будут какие-то 64-битные числа (например, 2 63 -1), которые он никогда не выведет.

2
27.01.2020, 21:12

macOS поставляется с Python. Используйте его модуль random .

python -c 'import random; rng = random.SystemRandom(); print rng.randint(-2**63, 2**63-1)
4
27.01.2020, 21:12

Теги

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