LINUX.ORG.RU

Подскажите быстрый генератор псевдо-рандома, который плохо сжимается gzip'ом?


0

1

Что-нибудь в пару-десяток строчек на Си.

Продолжение этого треда: Игра через ssh отображается «рывками»

UPD: Проведено первое тестирование с нижеприведенным вызовом random(), позже заменю на «быструю» версию рандома. Пока все работает замечательно. Лаги исчезли (позже, 100 тыс рандомных символов в каждом терминале, сокращу до приемлимого числа - порядка 10-20 тыс).

★★★★★

Последнее исправление: pacify (всего исправлений: 1)

Ответ на: комментарий от adriano32

Просто хотелось бы чего-нибудь, быстрее этого:

    int iter;
    for(iter = 0; iter < 10000; iter++) {
      int r = rand();
      char r0 = ((r) % 0x000000FF);
      char r1 = ((r >> 8) % 0x000000FF);
      char r2 = ((r >> 16) % 0x000000FF);
      char r3 = ((r >> 24) % 0x000000FF);
      mvwprintw(windowGame,maxy,maxx,&r0);
      mvwprintw(windowGame,maxy,maxx,&r1);
      mvwprintw(windowGame,maxy,maxx,&r2);
      mvwprintw(windowGame,maxy,maxx,&r3);
      mvwprintw(windowGame,maxy,maxx," ");
    }

pacify ★★★★★
() автор топика

> Подскажите быстрый генератор псевдо-рандома, который плохо сжимается gzip'ом?

сгенерь какуюнить фигню популярным алгоритмом и сожми гзипом. результат плохо сжимается гзипом ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

сожми гзипом. результат плохо сжимается гзипом ;)

Эта пять! :)

adriano32 ★★★
()
Ответ на: комментарий от arsi

> сгенерь какуюнить фигню популярным алгоритмом и сожми гзипом

Мне надо непрерывно на экран выводить этот поток, чтобы результат плохо жался ssh-сервером.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

И да, если то для твоей игрушки той, по секрету, сжатие можно отключать в конфиге сервера же!

man sshd_config

Compression
Specifies whether compression is allowed, or delayed until the user has authenticated successfully. The argument must be ``yes", ``delayed", or ``no". The default is ``delayed".

Понял?

adriano32 ★★★
()
Ответ на: комментарий от pacify

> Мне надо непрерывно на экран выводить этот поток

в злиб есть апи для потокового сжатия.)

arsi ★★★★★
()

Скажу честно - не в курсе насчёт сжимаемости gzip'ом, но тесты на рандомнесс проходит неплохо:

#define SEED 1
#define A_SHIFT 
#define B_SHIFT
#define C_SHIFT

int xorshift_rng()
{
    static int rnd = SEED;
    rnd ^= (rnd << A_SHIFT);
    rnd ^= (rnd >> B_SHIFT);
    rnd ^= (rnd << C_SHIFT);
    return rnd;
}

A_SHIFT, B_SHIFT, C_SHIFT подойдут не любые, они зависят от разрядности числа, не все дают максимальную последовательность 2^N, не все дают хороший рандом. Подбери экспериментально (напиши простенькую прогу) или погугли статью «xorshift random number generator». Это самый короткий псевдорандом, который мне удалось найти (надо было однажды сделать на микроконтроллере).

prischeyadro ★★★☆☆
()
Ответ на: комментарий от adriano32

> Напиши, что продолжение этого треда

Кстати, еще один баг - экран игры обновляется только при нажатии на клавишу.
То есть - чтобы увидеть бегущего Пак-Мана и приведений, надо постоянно
держать нажатой клавишу. Отчего так?

pacify ★★★★★
() автор топика
Ответ на: комментарий от prischeyadro

Подбери экспериментально (напиши простенькую прогу)


Ага, сейчас попробую. Сделал такую:

#include <stdio.h> // printf()
#include <stdlib.h> // random(), atoi()

int main(int argc, char **argv) {
  if (argc < 6) return -1;
  int seed = atoi(argv[1]);
  int a = atoi(argv[2]);
  int b = atoi(argv[3]);
  int c = atoi(argv[4]);
  unsigned int count = atoi(argv[5]);

  int rnd = seed;
  int i;
  for (i = 0; i < count; i++) {
    rnd ^= (rnd << a);
    rnd ^= (rnd >> b);
    rnd ^= (rnd << c);
    printf("%08X\n",rnd);
  }
  return 0;
}

pacify ★★★★★
() автор топика
Ответ на: комментарий от adriano32

что /dev/random классно сжимается gzip'om?

да не сжимается он ни чем

whiiteliites
()
Ответ на: комментарий от prischeyadro

Например, такие подходят:

#define SEED 1
#define A_SHIFT 9
#define B_SHIFT 9
#define C_SHIFT 8
А еще (до кучи):
$ sort -g -k4 shift.txt | rl | tail -n20
<a  b  c  bytes>
24 27 7 373878
2 25 24 400083
17 13 24 400083
20 1 11 400083
15 26 28 2589
30 6 24 2418
1 17 4 396376
26 18 28 2377
23 19 21 312065
2 15 17 400083
19 4 17 400083
21 17 26 2589
15 23 8 400083
10 18 16 235423
28 19 25 2961
1 11 10 400083
27 17 21 4838
15 2 14 400083
28 26 28 2177
30 24 4 2808
Чем больше «bytes» - тем лучше (больше размер gzip'нутого куска байт).

pacify ★★★★★
() автор топика
Ответ на: комментарий от arsi

Что может сжиматься хуже абсолютного рандома (пусть и псевдо)?

Подскажите быстрый генератор псевдо-рандома, который плохо сжимается gzip'ом?

сгенерь какуюнить фигню популярным алгоритмом и сожми гзипом. результат плохо сжимается гзипом ;)

Красиво ;) Можно было бы отправить в квотезы, если бы не тамошние невменяемые дауны.

mclaudt
()

Может быть все-таки можно решить проблему с ssh как-то по другому? На онлайн-серверах nethack проблем нет.

быстрый генератор псевдо-рандома

mersenne twister быстрый, хоть и много кода.

elverion
()
Ответ на: комментарий от elverion

> На онлайн-серверах nethack проблем нет.

Там NoDelay в опциях sshd стоит.
У меня же на сервере прав администратора нет, а пользователя мне не заставить перекомпилировать ssh-клиента с поддержкой TCP_NODELAY.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

>Мне надо непрерывно на экран выводить этот поток, чтобы результат плохо жался ssh-сервером.

cat /dev/urandom | gzip -f | gzip -f

madgnu ★★★★★
()
Ответ на: комментарий от madgnu

> cat /dev/urandom | gzip -f | gzip -f

Спасибо, но проблема «вылечилась» через wrefresh(). Поставил перед ним небольшую задержку в треде - вроде Core dump больше нет.

pacify ★★★★★
() автор топика
21 октября 2011 г.
Ответ на: комментарий от pacify

Не тыкай пальцем в небо, а возьми готовые из статьи Марсальи. Там приведены числа, которые дают период ровно 2 ^ n - 1. Для 32-битного например 13, 17, 5 или 1, 5, 16. Там же есть генераторы с большими периодами.

Недостаток генератора в том, что при близких seed'ах первые несколько сгенерированных чисел тоже будут очень близки. Потом последовательности конечно разойдутся.

anonymous
()
Ответ на: комментарий от anonymous

Хотя конечно для случайных задержек можно взять и генератор с периодом 10.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.