Генератор псевдослучайных чисел с фиксированной плотностью 1 с

Я ищу способ генерировать псевдослучайные числа [возможно низкой "случайности"] или псевдослучайные последовательности битов с фиксированным весом Hamming [фиксированная плотность 1 с]. Я нашел некоторое предложение об использовании простого линейного congruential генератора с семенем, имеющим вес Hamming, в котором я нуждаюсь, но никакое обоснование не было дано, почему это корректно [почему hamming вес является инвариантным при линейном congruential преобразовании]

Кто-либо мог обосновать, что точка или дает мне иначе?

Спасибо...

6
задан Mirco Richter 13 January 2010 в 22:28
поделиться

3 ответа

Для запуска создайте сервлет , который прослушивает определенный url-шаблон , например /pages/* . Реализуйте метод service () для поиска действия, связанного с методом запроса ( GET , POST и т.д.) и pathinfo (часть URL после url-шаблона сервлета ).

Основной пример:

protected void service(HttpServletRequest request, HttpServletResponse response) 
  throws ServletException, IOException {
  View view = new View(request, response);
  Action action = ActionFactory.getAction(request);
  action.execute(view);
  view.navigate();
}

Интерфейс Действие должен представлять единицу работы. Его можно реализовать для выполнения необходимой бизнес-логики:

public interface Action {
  void execute(View view);
}

ActionFactory должен поддерживать классы, реализующие Действие в виде Карта < Последовательность, Действие > , где ключ Последовательностей представляет собой меньше или больше комбинации метода запроса и пути. Затем можно получить Действие следующим образом:

public static Action getAction(HttpServletRequest request) {
  return actions.get(request.getMethod() + request.getPathInfo());
}

Представление должно представлять контекст области запроса, с которым может работать действие . В navigate () вы можете переслать запрос в JSP для дисплея:

public void navigate() {
  String path = "/WEB-INF" + request.getPathInfo() + ".jsp";
  request.getRequestDispatcher(path).forward(request, response);
}

Это должно вас начать (обратите внимание, что я оставил все очевидные проверки, такие как нулевые указатели, чтобы сделать примеры менее загроможденными, что зависит от вас сейчас).

Однако во всей истории необходимо учитывать другие аспекты, такие как проверка, преобразование, обработка событий, сопоставления входных значений, локализация, ввод зависимостей и т.д. Это все с полной работой. Более приличный MVC рамок учитывает большую часть всего этого, например, Sun JSF , Apache Struts , Spring MVC , Полосы и т.д. Если вы никогда не делали ни одного из них, то я настоятельно рекомендую сделать это до домашней гребли, иначе вы бы оказались с пустой тратой времени.

-121--4180469-

MapReduce является общим термином. Вы, вероятно, хотите спросить, подходит ли вам полнофункциональная структура MapReduce с управлением заданиями, например Hadoop. Ответ по-прежнему зависит от структуры, но обычно функции управления заданиями, сети, репликации данных и отказоустойчивости структуры MapReduce делают ее подходящей для задач, которые занимают минуты, часы или дольше, и это, вероятно, короткий и правильный ответ для вас.

Парадигма MapReduce может быть полезна вам, если ваши задачи можно разделить между независимыми сопоставителями и объединить с одним или несколькими редукторами, а язык, структура и инфраструктура, которые у вас есть, позволят вам воспользоваться этим.

Не обязательно проводить различие между MapReduce и базой данных. Декларативный язык, такой как SQL, является хорошим способом абстрагирования параллелизма, как и запрашиваемые рамки MapReduce, такие как HBase. В этой статье рассматриваются реализации MapReduce алгоритма k-means и заканчивается чистым примером SQL (который предполагает, что сервер может его распараллелить).

В идеале разработчику не нужно слишком много знать о сантехнике. Примеры Erlang показывают, как функциональный язык обрабатывает управление процессом.

Также имейте в виду, что есть легкие способы игры с MapReduce, такие как bashreduction .

-121--3595076-

edit : python позволяет легко перетасовать вещи

from random import shuffle

def gen(ham, bits=32):
    # generate a list with the correct number of 1's
    x = [1]*ham+[0]*(bits-ham)
    shuffle(x)
    # convert back to a number
    return int(''.join(map(str,x)),2)

>> print('\n'.join(bin(gen(5,15)) for x in range(10)))
0b101100100001000
0b100110010010
0b100110110000000
0b10010101100
0b11101100000
0b100100001000110
0b10000010101001
0b110000011100000
0b100011100010
0b100000011100010

Вот один из возможных способов (в основном, генерировать случайные перестановки базы последовательности:

  1. генерировать случайное факторное число N до вашей битовой глубины.
  2. преобразование факторадика в список индексов перестановок
  3. преобразование списка перестановок в битовый массив (показан псевдо-питоном):

    [x < вес для x в perm_list]

0
ответ дан 18 December 2019 в 04:54
поделиться

Я не слышал об использовании LCG для генерации фиксированного груза (я не получил так глубоко в хемерных кодах в школе, поэтому я тоже не слишком удивлен :).

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

from random import randrange

def get_ham_and_bits(weight, nbits=32):
    "Get n-bits with a fixed hamming weight"
    if weight > nbits: 
        return 1 < nbits

    result = 0
    for i in xrange(weight):
        bit = 1 << randrange(nbits)

        # only flip bits that aren't already flipped. delete the loop to
        # make this return a random weight instead of a fixed weight
        while bit & result != 0: 
            bit = 1 << randrange(nbits)

        # An XOR might be a better idea here, especially if you remove the loop.
        result |= bit
    return result
0
ответ дан 18 December 2019 в 04:54
поделиться

Использование генератора псевдослучайных чисел (ГПСЧ), даже простого с малым начальным числом, определенно НЕ является хорошим решением. ГПСЧ не поддерживает постоянный вес Хэмминга начального числа, и вся идея ГПСЧ состоит в том, чтобы удалить информацию о начальном состоянии.

Если вы хотите, чтобы биты были установлены равными 1 из n, ваш вопрос является вариантом этих двух вопросов. Если k намного меньше n, решение перетасовки - O (n). Я думаю, что следующее решение - O (k).

Он основан на этом ответе в python

from random import sample

def konesoutofn(k, n):
    output=0
    for d in sample(xrange(n), k):output+=(1<<d)
    return output

x=konesoutofn(4,32)
print(bin(x))

. Если вы хотите иметь примерно k битов, равных единице, где k / n - вероятность того, что каждый бит будет равным единице, тогда вы нужно смотреть на Бернулли и геометрические распределения.

0
ответ дан 18 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

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