Июн 09 2010

Как это работает?

switch ((rand() >> 8) % 3) 
//the ">> 8" (typically) improves the period of the lowest 2 bits
       case 0: DoSmth();
       case 1: DoSmth1();
       case 2: DoSmth2();
     }
  • Михаил

    Выполняем одну из трех DoSmth() выбранную случайно. Или есть глубинный смысл?

  • arktur04

    Глубинный смысл в выражении ((rand() >> 8 ) % 3).

  • Михаил

    rand() — Получаем случайное число
    >>8 — ограничиваем диапазон, для меньшего прыгания переменной от итерации к итерации
    %3 — приводим к нашему диапазону в switch(всего 3 case).

  • arktur04

    Здесь вопрос вот в чём. Согласно стандарту, rand() генерирует случайное число от 0 до 32767, т.е. 15 бит:
    0 bit15 … bit0
    Потом мы его сдвигаем на 8 бит:
    0 0 0 0 0 0 0 0 0 bit15 … bit8
    биты с 0 по 7 исчезли.

    Дальше мы находим остаток от деления на 3. Вопрос в том, что какая разница, как прыгало исходное число? Всё равно мы получим 0, 1 или 2 с равной вероятностью. К примеру, отгадайте, какой из числовых рядов получен с операцией сдвига на 8, а какой — без:

    1, 1, 0, 0, 1, 1, 2, 2, 2, 0, 2, 1

    2, 2, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1

  • Михаил

    Верхний с сдвигом.
    То что получим 0, 1 или 2 с одинаковой вероятностью я согласен. Период «перескока» между этими значениями увеличивается. При сдвиге мы получили диапазоны, попадание случайного 16bit-го значения в которые, представляется уже одним числом. Например все числа 0…255 после сдвига стали =0. И в результате приводят к выполнению одного и того же case.

  • arktur04

    Нет никакого периода.
    Соседние значения не имеют взаимных корелляций (точнее, не должны иметь, если генератор сл. чисел хороший).