Получение случайного числа в заданном интервале - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ребята подскажите пожалуйста хороший способ реализации рандома в си. Нужен от 0 до 36. Вот мой код
srand(time(NULL));
winnumb = rand() % 36;
Но он левый какой-то, почти всегда выбивает одни и те же 5-7 чисел и все нечётные. Подскажите пожалуйста, заранее благодарен.

Решение задачи: «Получение случайного числа в заданном интервале»

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():

  1. Включает заголовочный файл time.h, который содержит функции работы со временем.
  2. Включает заголовочный файл stdio.h, который содержит функции ввода-вывода.
  3. Определяет функцию main().
  4. Запускает бесконечный цикл while(1), в котором выводит на экран случайное число, полученное с помощью функции randtsc().
  5. Функция randtsc() использует инструкцию RDTSC для получения текущего значения счётчика времени процессора.
  6. Результат сохраняется в переменной rslt.
  7. Используется арифметическая операция AND для очистки значения регистра al от всех битов, кроме 19, 18 и 17.
  8. Используется инструкция ROL для сдвига значения регистра eax влево на 19 позиций, что приводит к переносу всех битов, кроме последнего, на следующую позицию.
  9. Значение регистра edx устанавливается равным нулю.
  10. Используется инструкция IDIV для деления значения регистра eax на значение переменной divisor.
  11. Результат сохраняется в переменной eax.
  12. Функция возвращает значение rslt. Ошибки в коде:
  13. Отсутствует объявление переменной divisor, которая используется в качестве делителя при делении.
  14. Отсутствует объявление переменной rslt, которая используется для хранения результата вычисления.
  15. Функция main() не должна выполняться в бесконечном цикле while(1).
  16. В функции main() не выполняется инициализация генератора случайных чисел перед использованием функции randtsc().

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы