На мой взгляд, вышеупомянутый ответ действительно дает некоторый «случайный» float, но ни один из них не является поистине случайным поплавком (т. е. они пропускают часть представления float). Прежде чем я буду спешить с моей реализацией, сначала рассмотрим стандартный формат ANSI / IEEE для float:
| sign (1-bit) | e (8 бит) | f (23-бит) |
число, представленное этим словом, равно (-1 * sign) * 2 ^ e * 1.f
отметить, что число «e» равно (с смещением 127), таким образом, варьируя от -127 до 126. Самая простая (и фактически самая случайная) функция состоит в том, чтобы просто записать данные случайного int в поплавок, таким образом
int tmp = rand();
float f = (float)*((float*)&tmp);
обратите внимание, что если вы сделаете float f = (float)rand();
, он преобразует целое число в float (таким образом, 10 станет 10.0). Итак, если вы хотите ограничить максимальное значение, вы можете сделать что-то вроде (не уверен, что это работает)
int tmp = rand();
float f = *((float*)&tmp);
tmp = (unsigned int)f // note float to int conversion!
tmp %= max_number;
f -= tmp;
, но если вы посмотрите на структуру поплавка, вы увидите, что максимальное значение float (приблизительно) 2 ^ 127, который больше, чем максимальное значение int (2 ^ 32), таким образом исключая значительную часть чисел, которые могут быть представлены поплавком. Это моя окончательная реализация:
/**
* Function generates a random float using the upper_bound float to determine
* the upper bound for the exponent and for the fractional part.
* @param min_exp sets the minimum number (closest to 0) to 1 * e^min_exp (min -127)
* @param max_exp sets the maximum number to 2 * e^max_exp (max 126)
* @param sign_flag if sign_flag = 0 the random number is always positive, if
* sign_flag = 1 then the sign bit is random as well
* @return a random float
*/
float randf(int min_exp, int max_exp, char sign_flag) {
assert(min_exp <= max_exp);
int min_exp_mod = min_exp + 126;
int sign_mod = sign_flag + 1;
int frac_mod = (1 << 23);
int s = rand() % sign_mod; // note x % 1 = 0
int e = (rand() % max_exp) + min_exp_mod;
int f = rand() % frac_mod;
int tmp = (s << 31) | (e << 23) | f;
float r = (float)*((float*)(&tmp));
/** uncomment if you want to see the structure of the float. */
// printf("%x, %x, %x, %x, %f\n", (s << 31), (e << 23), f, tmp, r);
return r;
}
с использованием этой функции randf(0, 8, 0)
вернет случайное число между 0.0 и 255.0
Для тех, кто хочет знать решение. Я полагаю, что он тестирует пакет от FeatureTools.
https://github.com/Featuretools/predict-remaining-useful-life
import utils
- это не то, что вы устанавливаете с помощью conda или pip install, а утилиты Скрипт .py можно скачать со страницы gitub FeatureTools.