CMAC: очень длинное целое число в качестве начального числа для функции random ()

0

Я проверил документацию stdlib и там сказано, что мы можем использовать unsigned long int как семя для srand(). Проблема заключается в следующем: мне нужно использовать число до 40 цифр в качестве семени. Это семя извлекается из матрицы ассоциаций, используемой для многомерной проблемы модуляции CMAC.

Как я могу решить эту проблему? В качестве примера см. Следующий код:

#include <stdlib.h>

int main(int argc, char ** argv)
{
    int inputVariable = getStateOfAdressedSpace();
    int generatedNumber;
    unsigned long long mySeed = getSeedFromMatrix( inputVariable );

    srandom( mySeed );
    generatedNumber = random( );
}

Это очень слабый пример, но это потому, что весь код будет слишком большим, чтобы продемонстрировать, просто представьте, что переменная mySeed будет очень длинным целым числом, и там, где лежит моя проблема. Я был бы очень благодарен, если кто-нибудь покажет мне, как это можно сделать, возможно, даже используя метод генератора псевдослучайных чисел (PRNG) или что-то в этом роде. Имейте в виду, что сгенерированное число должно быть уникальным.

Теги:
neural-network
random

1 ответ

0

Простым способом достижения чего-то, что будет "неотличимым от случайного" и которое использует все цифры произвольного количества семян, было бы следующее (непроверенное - это просто показать принцип):

char* mySeed = "123454321543212345678908765434234576897654267349587623459872039487102367529364520";
char bitOfString[6];
int ii;
long int randomNumber=0;
for(ii=0; ii<strlen(mySeed)-5; ii+=5) {
  strncpy(bitOfString, mySeed+ii, 5);
  bitOfString[5]='\0';
  srandom(atoi(bitOfString));
  randomNumber += random();
}
randomNumber = randomNumber % RAND_MAX;

Это генерирует случайные числа на основе "того, что достаточно мало, чтобы быть семенем" (я использовал число 5 для длины строки, но вы могли выбрать другое число, в зависимости от размера int на вашем компьютере). Вы можете сделать это "более случайным", не выбирая только первое случайное число, сгенерированное в каждом цикле, но Nth (так что замена блоков цифр не приведет к такому же результату).

Нижняя строка - вы создаете другую случайную последовательность. Математическая невозможность того, что каждый из 10 40 семян даст другое случайное число - этот метод должен отображать семя "произвольного размера" на равномерно распределенное число в диапазоне генератора случайных чисел.

Обратите внимание, что я использовал long int для randomNumber хотя random() создает int random. Это позволяет суммировать несколько случайных чисел, не опасаясь переполнения - и окончательное модульное деление гарантирует, что число, в котором вы закончите, будет (приблизительно) равномерно распределенным (особенно, если вы закончите делать большое количество вызовов random()),,

Ждем ваших размышлений об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню