Нужен трикс.

Тема в разделе "WASM.ZEN", создана пользователем Lof, 9 авг 2007.

  1. Lof

    Lof New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    14
    В EAX случайное число.
    Надо чтобы в 50% слачаев мы получали 1(00000001), а в других 50% -1(FFFFFFFF).
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Берешь любой генератор псевдослучайных чисел (поищи в Инете), и смотришь последний бит чисел генерируемой последовательности. Если генератор равновероятный, получаешь искомое.
     
  3. Lof

    Lof New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    14
    У меня уже есть случайное число в EAX. Надо из него получит 1 или -1 с 50% вероятностью.
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Lof
    Выделяй в регистре последний бит.
     
  5. Lof

    Lof New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    14
    И?
    Надо без cmp. Была идея с shl eax,31, но не смог додумать.
     
  6. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    and eax, 1 ; 0 | 1
    shr eax, 1
    sbb eax, eax | 0 | -1
    or eax, 1


    =)) хотя наверно я что-нибудь напутал
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Lof
    and eax,1
    neg eax
    sbb eax,eax
    and al,0FEh
    add eax,1
    neg eax
    sbb eax,eax
    neg eax
     
  8. Lof

    Lof New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    14
    Наверное так имел ввиду
    and eax,1
    neg eax
    sbb eax,eax
    and al,0FEh
    add eax,1
     
  9. Lof

    Lof New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    14
    Работает :)
     
  10. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Lof
    Это был мутный поток сознания, отягощенный тяжелым административным совещанием :-(((
     
  11. GanDJuStas

    GanDJuStas New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2003
    Сообщения:
    21
    Адрес:
    Russia
    Вероятности 0/1 не равны 1/2 для всех битов числа в любом псевдослучайном генераторе.

    Наиболее близким к 50 на 50 будет принятие решения по флагу четности, но код с бранчевыми инструкцияыми получится
     
  12. Lof

    Lof New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    14
    GanDJuStas
    Вот код, как я тестил
    Код (Text):
    1. int main()
    2. {
    3.     size_t proc = 0;
    4.     size_t proc2 = 0;
    5.     size_t all = 0;
    6.     for(size_t i = 0; i < 10000; i++)
    7.     {
    8.         int a = rand();
    9.         int b = 0;
    10.  
    11.         if(a > RAND_MAX/2)
    12.         {
    13.             proc++;
    14.         }
    15.         _asm
    16.         {
    17.             mov eax, a;
    18.             and eax, 1;
    19.             shr eax, 1;
    20.             sbb eax, eax;
    21.             or eax, 1;
    22.             mov a, eax;
    23.         }
    24.         if(a == -1)
    25.         {
    26.             proc2++;
    27.         }
    28.  
    29.         all++;
    30.     }
    31.  
    32.     std::cout << proc << " " << proc2 << "\n";
    33.     return 0;
    34. }
     
  13. NoResponse

    NoResponse New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2005
    Сообщения:
    89
    а чего так сложно то ?
    and eax,1
    dec eax
     
  14. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    NoResponse
    у тебя будет 0 или -1, а нужно 1 или -1
     
  15. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    по старшему биту:
    Код (Text):
    1. sar eax,31
    2. or eax,1
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    GanDJuStas
    Странно. Линейный конгруэнтный генератор
    x(n+1) = (a * x(n) + c) % N, где a взаимно просто с N,
    дает на выходе все числа от 0 до N-1 в случайном порядке. Ясно, что в этой последовательности количество четных и нечетных чисел одинаково.
     
  17. Турецкий

    Турецкий New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    10
    Но реально будет использоваться не N чисел, а максимум N/10. Среди них четных и нечетных будет не поровну.
     
  18. Lof

    Lof New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    14
    Там же есть код, подтверждающий, что четных и нечетных 50-50.
     
  19. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    NoResponse
    Kozyr__
    Ну тогда:
    Код (Text):
    1. and eax,1
    2. dec eax
    3. or eax,1
     
  20. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    А вообще, лучше всех вариант asmfan'а, так как старший бит в случае линейного конгруэнтного генератора (то есть в языках высокого уровня) наиболее случаен. А младший в лучшем случае является последовательностью 0-1-0-1-0-1..., а в худшем - вообще не меняется.