Г-н STL объяснил, почему это (и другие связанные с rand()
конструкции) очень плохая идея в своей презентации "rand() считается вредным".
Идея этого кода состоит в том, чтобы использовать плавающую точку, чтобы уменьшить потерю энтропии случайного числа, ограниченного операцией по модулю.
Как указывает Стивен, решение с плавающей запятой не имеет проблемы, которую вводит операция по модулю (в основном существует интервал значений, которые с большей вероятностью будут сгенерированы, чем другие, благодаря модулю, нарушающему теоретическое единообразие rand()
).
Но числа с плавающей запятой вводят новая проблема: округление, производимое при окончательном преобразовании из типа float в целочисленный тип, ожидаемый пользователем, приводит к проблеме, что одно и то же число генерируется много раз для разных входных данных, но несколько значений генерируются только одним< /сильный>. Таким образом, снова теряется единообразие. Конечно, это округление не является проблемой, если целью является создание случайного числа с плавающей запятой, как в вашем случае. Но выполняемые округления и деления также могут привести к нарушению равномерности распределения.
Вывод из всего вышесказанного таков: Этот код пытается решить проблемы единообразия классическим способом по модулю, но приводит (меньше? Я не уверен) к проблемам единообразия. Так что попробуйте заменить случайные возможности C другими библиотеками (например, стандартной <random>
библиотекой, представленной начиная с C++11).
person
Manu343726
schedule
01.03.2014