В EAX случайное число. Надо чтобы в 50% слачаев мы получали 1(00000001), а в других 50% -1(FFFFFFFF).
Берешь любой генератор псевдослучайных чисел (поищи в Инете), и смотришь последний бит чисел генерируемой последовательности. Если генератор равновероятный, получаешь искомое.
Вероятности 0/1 не равны 1/2 для всех битов числа в любом псевдослучайном генераторе. Наиболее близким к 50 на 50 будет принятие решения по флагу четности, но код с бранчевыми инструкцияыми получится
GanDJuStas Вот код, как я тестил Код (Text): int main() { size_t proc = 0; size_t proc2 = 0; size_t all = 0; for(size_t i = 0; i < 10000; i++) { int a = rand(); int b = 0; if(a > RAND_MAX/2) { proc++; } _asm { mov eax, a; and eax, 1; shr eax, 1; sbb eax, eax; or eax, 1; mov a, eax; } if(a == -1) { proc2++; } all++; } std::cout << proc << " " << proc2 << "\n"; return 0; }
GanDJuStas Странно. Линейный конгруэнтный генератор x(n+1) = (a * x(n) + c) % N, где a взаимно просто с N, дает на выходе все числа от 0 до N-1 в случайном порядке. Ясно, что в этой последовательности количество четных и нечетных чисел одинаково.
Но реально будет использоваться не N чисел, а максимум N/10. Среди них четных и нечетных будет не поровну.
А вообще, лучше всех вариант asmfan'а, так как старший бит в случае линейного конгруэнтного генератора (то есть в языках высокого уровня) наиболее случаен. А младший в лучшем случае является последовательностью 0-1-0-1-0-1..., а в худшем - вообще не меняется.