Я прочитал несколько примеров кода на домашней странице ISAAC , и этот код кажется простым для реализации. Если вам это нужно на чистом Python, есть несколько примеров на других языках, которые помогут вам при переносе.
Другой способ использования isaac()
из Python - это создание кода C в качестве разделяемой библиотеки и доступ к нему через модуль ctypes , который является стандартным в 2.5 + , но может быть найден в PyPI для более ранних версий . Это также должно работать намного лучше, чем прямой порт в чистом Python.
Вот пример построения версии C isaac()
в качестве разделяемой библиотеки и использования ее через ctypes. Сначала вам нужно скачать rand.c
, rand.h
и standard.h
с сайта автора, а затем собрать:
% gcc -shared -fPIC -o libisaac.so rand.c
Вот код Python. Обратите внимание, что размеры полей в RandCtx
зависят от того, создан ли код для 32- или 64-битной платформы. Я тестировал на 64-битной Ubuntu. Для 32-битных вам нужно изменить все поля, чтобы использовать c_uint32
:
from ctypes import *
class RandCtx(Structure):
RANDSIZL = 8
RANDSIZ = 1 << RANDSIZL
_fields_ = [
('randcnt', c_uint64),
('randrsl', c_uint64 * RANDSIZ),
('randmem', c_uint64 * RANDSIZ),
('randa', c_uint64),
('randb', c_uint64),
('randc', c_uint64)
]
ctx = RandCtx()
lib = cdll.LoadLibrary('./libisaac.so')
lib.randinit(byref(ctx), 0)
lib.isaac(byref(ctx))
for i in xrange(4):
print ctx.randrsl[i]
Выход:
% python isaac.py
14012348966175605106
8193820543905647488
4194352129441799609
12121047914186473054