Получение случайного числа в заданном интервале - C (СИ)
Формулировка задачи:
Ребята подскажите пожалуйста хороший способ реализации рандома в си. Нужен от 0 до 36.
Вот мой код
Но он левый какой-то, почти всегда выбивает одни и те же 5-7 чисел и все нечётные.
Подскажите пожалуйста, заранее благодарен.
srand(time(NULL)); winnumb = rand() % 36;
Решение задачи: «Получение случайного числа в заданном интервале»
textual
Листинг программы
#include <time.h>
#include <stdio.h>
int randtsc(void)
{ int rslt;
const int divisor = 36;
__asm{ pushd 0
call time
add esp,4
and al, 0x1f
mov cl, al
rdtsc
rol eax,cl
xor edx,edx
idiv [divisor]
mov eax,edx
};
}; // ожидается матюг о том, что ф-ция должна возвращать значение
void main(void)
{
while(1) printf("%d\n\r",randtsc());
};
Объяснение кода листинга программы
На языке ассемблера функция randtsc() используется для получения случайного числа в заданном интервале. Для этого используется инструкция RDTSC (Read Time Stamp Counter), которая возвращает текущее значение счётчика времени процессора. Затем это значение делится на делитель (в данном случае 36), что приводит к его уменьшению в 36 раз. Код на языке C, использующий функцию randtsc():
- Включает заголовочный файл time.h, который содержит функции работы со временем.
- Включает заголовочный файл stdio.h, который содержит функции ввода-вывода.
- Определяет функцию main().
- Запускает бесконечный цикл while(1), в котором выводит на экран случайное число, полученное с помощью функции randtsc().
- Функция randtsc() использует инструкцию RDTSC для получения текущего значения счётчика времени процессора.
- Результат сохраняется в переменной rslt.
- Используется арифметическая операция AND для очистки значения регистра al от всех битов, кроме 19, 18 и 17.
- Используется инструкция ROL для сдвига значения регистра eax влево на 19 позиций, что приводит к переносу всех битов, кроме последнего, на следующую позицию.
- Значение регистра edx устанавливается равным нулю.
- Используется инструкция IDIV для деления значения регистра eax на значение переменной divisor.
- Результат сохраняется в переменной eax.
- Функция возвращает значение rslt. Ошибки в коде:
- Отсутствует объявление переменной divisor, которая используется в качестве делителя при делении.
- Отсутствует объявление переменной rslt, которая используется для хранения результата вычисления.
- Функция main() не должна выполняться в бесконечном цикле while(1).
- В функции main() не выполняется инициализация генератора случайных чисел перед использованием функции randtsc().