Показано с 1 по 10 из 239

Тема: Временная тема

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    опять же не показана реализация флоата в oscat_next, маска из трех или четырех байт, если сделано по анологии с xorshift тогда теряется некоторая часть случайных значений и вряд ли будут пройдены тесты
    Вот код rdm. Тесты НЕ проходит.
    Код:
    unsigned int bit_count(unsigned int n) {
      unsigned int c;
      for (c=0;n>0;n=n&(n-1)) c++;
      return c;
    }
    
    unsigned int rol(unsigned int x, unsigned int n){
            return (x << n)|(x >> (32-n));
    }
    
    void rdm()
    {
            int             i, counter;
            unsigned bit;
            int             num_0s, num_1s, v, bitsRead;
            unsigned char x = 42;
            unsigned char mask;
            unsigned int T_PLC_MS = 7*24*3600*1000;
            unsigned int tn;
            unsigned int tc;
    
            float m;
            float rx;
            float rdm;
            float last;
            float E = exp(1.0);
    
            if ( ((epsilon = (BitSequence *) calloc(tp.n, sizeof(BitSequence))) == NULL) ) {
                    printf("Insufficient memory available.\n");
                    exit(1);
            }
            counter = 1;
            last = 42;
            for ( v=0; v < tp.numOfBitStreams; v++ ) {
                    mask = 0;
                    num_0s = 0;
                    num_1s = 0;
                    bitsRead = 0;
                    for ( i=0; i < tp.n; i++ ) {
    //                      if (mask == 0) {
                                    mask = 0x800000;
                                    tn = clock() * 1000.0/ CLOCKS_PER_SEC;
                                    tc = bit_count(tn);
                                    tn |= (tn&(1 << (2))) << (31-2);
                                    tn |= (tn&(1 << (5))) << (30-5);
                                    tn |= (tn&(1 << (4))) << (29-4);
                                    tn |= (tn&(1 << (1))) << (28-1);
                                    tn |= (tn&(1 << (0))) << (27-0);
                                    tn |= (tn&(1 << (7))) << (26-7);
                                    tn |= (tn&(1 << (6))) << (25-6);
                                    tn |= (tn&(1 << (3))) << (24-3);
                                    tn = rol(tn, bit_count(tn)) | 0x80000001;
                                    tn = tn % 71474513 + (tc + 77);
                                    rdm = ((float)tn) / 10000000.0 * (E - (last < 0.0 ? 0 : (last > 1.0?1.0:last) ));
                                    rdm = rdm - floor(rdm);
                                    last = rdm;
    //                              T_PLC_MS+=10;
    //                      }
                            if ( rdm < 0.5 ) {//(x & mask) == 0 ) {
                                    bit = 0;
                                    num_0s++;
                            }
                            else {
                                    bit = 1;
                                    num_1s++;
                            }
                            mask /= 2;
                            bitsRead++;
                            epsilon[i] = bit;
                    }
                    fprintf(freqfp, "\t\tBITSREAD = %d 0s = %d 1s = %d\n", bitsRead, num_0s, num_1s); fflush(freqfp);
                    nist_test_suite();
                    }
            free(epsilon);
    }

    Вот код xorshift128, тесты проходит (все, кроме теста LinearComplexity) (проходит как в варианте float 0..1, так и в варианте когда учитываем все 32 бита):
    Код:
    void
    xorshift128()
    {
            int             i, counter;
            unsigned bit;
            int             num_0s, num_1s, v, bitsRead;
            unsigned int res;
            unsigned int mask;
            unsigned int x = 123456789;
            unsigned int y = 362436069;
            unsigned int z = 521288629;
            unsigned int w = 88675123;
    
            if ( ((epsilon = (BitSequence *) calloc(tp.n, sizeof(BitSequence))) == NULL) ) {
                    printf("Insufficient memory available.\n");
                    exit(1);
            }
            counter = 1;
    
            for ( v=0; v < tp.numOfBitStreams; v++ ) {
                    mask = 0;
                    num_0s = 0;
                    num_1s = 0;
                    bitsRead = 0;
                    for ( i=0; i < tp.n; i++ ) {
    //                      if (mask == 0) {
                                    mask = 0x80000000;
                                    unsigned int t = x ^ (x << 11);
                                    x = y; y = z; z = w;
                                    w ^= (w >> 19) ^ t ^ (t >> 8);
                                    res = w;
    /*                              fprintf(freqfp, "value = 
    \n", res);
                                    if (v > 1024) {
                                    exit(-1);
                                    }*/
    //                      }
    //                      if ( (res & mask) == 0 ) {
                            if ( (res&16777215)/16777216.0 < 0.5 ) {
                                    bit = 0;
                                    num_0s++;
                            }
                            else {
                                    bit = 1;
                                    num_1s++;
                            }
                            mask /= 2;
                            bitsRead++;
                            epsilon[i] = bit;
                    }
                    fprintf(freqfp, "\t\tBITSREAD = %d 0s = %d 1s = %d\n", bitsRead, num_0s, num_1s); fflush(freqfp);
                    nist_test_suite();
                    }
            free(epsilon);
    }
    Что на этот раз?
    Последний раз редактировалось Владимир Ситников; 19.07.2016 в 10:48.

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,649

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Код:
    unsigned int bit_count(unsigned int n) {
      unsigned int c;
      for (c=0;n>0;n=n&(n-1)) c++;
      return c;
    }
    
    unsigned int rol(unsigned int x, unsigned int n){
            return (x << n)|(x >> (32-n));
    }
    
    void rdm()
    {
            int             i, counter;
            unsigned bit;
            int             num_0s, num_1s, v, bitsRead;
            unsigned char x = 42;
            unsigned char mask;
            unsigned int T_PLC_MS = 7*24*3600*1000;
            unsigned int tn;
            unsigned int tc;
    
            float m;
            float rx;
            float rdm;
            float last;
            float E = exp(1.0);
    
            if ( ((epsilon = (BitSequence *) calloc(tp.n, sizeof(BitSequence))) == NULL) ) {
                    printf("Insufficient memory available.\n");
                    exit(1);
            }
            counter = 1;
            last = 42;
            for ( v=0; v < tp.numOfBitStreams; v++ ) {
                    mask = 0;
                    num_0s = 0;
                    num_1s = 0;
                    bitsRead = 0;
                    for ( i=0; i < tp.n; i++ ) {
    //                      if (mask == 0) {
                                    mask = 0x800000;
                                    tn = clock() * 1000.0/ CLOCKS_PER_SEC;
                                    tc = bit_count(tn);
                                    tn |= (tn&(1 << (2))) << (31-2);
                                    tn |= (tn&(1 << (5))) << (30-5);
                                    tn |= (tn&(1 << (4))) << (29-4);
                                    tn |= (tn&(1 << (1))) << (28-1);
                                    tn |= (tn&(1 << (0))) << (27-0);
                                    tn |= (tn&(1 << (7))) << (26-7);
                                    tn |= (tn&(1 << (6))) << (25-6);
                                    tn |= (tn&(1 << (3))) << (24-3);
                                    tn = rol(tn, bit_count(tn)) | 0x80000001;
                                    tn = tn % 71474513 + (tc + 77);
                                    rdm = ((float)tn) / 10000000.0 * (E - (last < 0.0 ? 0 : (last > 1.0?1.0:last) ));
                                    rdm = rdm - floor(rdm);
                                    last = rdm;
    //                              T_PLC_MS+=10;
    //                      }
                            if ( rdm < 0.5 ) {//(x & mask) == 0 ) {
                                    bit = 0;
                                    num_0s++;
                            }
                            else {
                                    bit = 1;
                                    num_1s++;
                            }
                            mask /= 2;
                            bitsRead++;
                            epsilon[i] = bit;
                    }
                    fprintf(freqfp, "\t\tBITSREAD = %d 0s = %d 1s = %d\n", bitsRead, num_0s, num_1s); fflush(freqfp);
                    nist_test_suite();
                    }
            free(epsilon);
    }
    Что на этот раз?
    Пересчет времени в секунды выполняется по формуле: clock() / CLOCKS_PER_SEC
    следовательно Вы хотите получить миллисекунды, для работы в цикле, да еще на Вашем мощном компе у большинства итераций это будет постоянное число и это можно было бы не принимать в расчет, если бы следовать рекомендациям
    in order to use rdm more then once within one sps cycle it need to be called with different seed numbers LAST
    оно к сожалению у Вас тоже постоянное, а не значение предыдущей итерации как это делал я
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    оно к сожалению у Вас тоже постоянное, а не значение предыдущей итерации как это делал я
    Где постоянное?

    Вот эту строку видели?
    last = rdm;

    Она как раз обновляет last при каждой итерации.
    Посмотрите ещё раз, но внимательнее.


    Цитата Сообщение от capzap Посмотреть сообщение
    следовательно Вы хотите получить миллисекунды, для работы в цикле, да еще на Вашем мощном компе у большинства итераций это будет постоянное число
    Я пробовал +=10 -- тесты не проходят.
    Пробовал и clock() -- тесты тоже не проходят.

    Разумеется, если само значение T_PLS_MS будет давать хороший шум, то генератор будет более хорошим.
    НО: зачем надеяться на то, что это T_PLS_MS будет хорошо шуметь? Где гарантия, что оно будет хорошо шуметь?
    Зачем так цепляться за OSCAT random, правильность работы которого весьма сомнительна, да и которую ещё нельзя "часто-часто" вызывать?
    У xorshift128 нет ограничений на количество вызовов в одну миллисекунду. Качество генератора не меняется со временем.
    Я уже много раз это говорил эту мысль.

    Хватит скакать с мысли на мысль.
    capzap, вы там что-то про "куда копать" говорили.

    Я мало того, что показал весь код, так ещё и проверил его. Видно, что в условиях совпадающих с рекомендуемыми для тестов, oscat тесты не проходит, а xorshift128 -- проходит.

    Значения 0..1 тоже генерируются, проблем не вижу.
    Последний раз редактировалось Владимир Ситников; 19.07.2016 в 11:26.

Похожие темы

  1. Тема для диплома
    от Gordan007 в разделе Трёп (Курилка)
    Ответов: 13
    Последнее сообщение: 18.01.2014, 12:08
  2. Бродит тема..
    от energohran в разделе Разработки
    Ответов: 3
    Последнее сообщение: 10.04.2012, 12:53
  3. МОДУС: тема защиты прошивки
    от Elka в разделе Модус 5684-0
    Ответов: 1
    Последнее сообщение: 28.11.2011, 22:39
  4. Язык ST. Временная задержка.
    от neoarey в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 26.03.2011, 01:15
  5. Ответов: 61
    Последнее сообщение: 12.09.2008, 09:49

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •