Получение случайного числа в заданном интервале - 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().
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д