Сгенерировать случайное число float в диапазоне от -100.001 до +100.001 с использованием Intel RdRand - C (СИ)
Формулировка задачи:
Существует библиотека RdRand от Intel, которая позволяет использовать генератор случайных чисел на базе эффекта энтропии кристалла процессора. https://ru.wikipedia.org/wiki/RdRand
Сама библиотека и описание её использования: https://software.intel.com/en-us/art...ber-generation
Внутри библиотеки пример, который просто печатает содержимое массива, сгенерированного случайным образом.
Помогите, пожалуйста, получить код на Си, который позволит с помощью этой библиотеки сгенерировать число float в диапазоне между -100.001 до +100.001
Нашёл код только на базе генератора псевдослучайных чисел:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double randoms(double min, double max)
{
return (double)(rand())/RAND_MAX*(max - min) + min;
}
int main()
{
srand((unsigned int)time(0));
printf("%f\n",randoms(-100.001, 100.001));
return 0;
}Решение задачи: «Сгенерировать случайное число float в диапазоне от -100.001 до +100.001 с использованием Intel RdRand»
textual
Листинг программы
#include <stdio.h>
#include <limits.h>
float randoms(float *randf, float min, float max)
{
int retries= 10;
unsigned long long rand64;
while(retries--) {
if ( __builtin_ia32_rdrand64_step(&rand64) ) {
*randf= (float)rand64/ULONG_MAX*(max - min) + min;
return 1;
}
}
return 0;
}
int main()
{
float randf;
if ( randoms(&randf, -100.001, 100.001) ) printf("%f\n", randf);
else printf("Failed to get a random value\n");
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек: iostream.h, cmath.h, inttypes.h
- Макросы и константы:
- UINT64_C(val) - преобразует 64-битное беззнаковое целое число в строку
- LLONG_MAX, LLONG_MIN, ULLONG_MAX - максимальные значения для 64-битных значений
- Объявление функции randoms:
- Принимает указатель на переменную типа float &randf, значения min и max
- Возвращает 1 при успешном генерировании случайного числа, 0 - в противном случае
- Объявление функции main:
- Главная функция программы
- Выполняет генерацию случайного числа с помощью функции randoms
- Выводит сгенерированное число на экран
- Возвращает 0, завершая работу программы
- Генерация случайного числа с помощью функции randoms:
- Переменная retries инициализируется значением 10
- Цикл while выполняется 10 раз
- В каждой итерации происходит попытка сгенерировать случайное число с помощью инструкции __builtin_ia32_rdrand64_step
- Если генерация прошла успешно, значение переменной rand64 приводится к типу float и преобразуется в диапазон от min до max
- Переменная randf получает сгенерированное случайное число
- Функция возвращает 1
- Вывод сообщения об ошибке в случае неудачной генерации случайного числа