随机浮点发生器
Random Float Generator
我正在学习 C++,我正在尝试生成一个随机浮点数,但似乎遇到了一些困难。
我首先创建一个介于 -100 和 100 之间的随机 int(),newRandom,然后我将那个 newRandom 变成一个随机浮点数,rand_X,介于 -1.0 和 1.0 之间。唯一需要注意的是我不希望 rand_X 在 -0.2 和 0.2 之间,换句话说,
-1.0 <= rand_X <= -0.2 和 0.2 <= rand_X <= 1.0。
这是我的代码,
#include "stdafx.h"
#include <iostream>
#include <random>
int newRandom() {
int newRandom = 0;
std::random_device rd; // obtain a random number from hardware
std::mt19937 eng(rd()); // seed the generator
std::uniform_int_distribution<> distr(-100, 100); // define the range
newRandom = distr(eng);
return newRandom;
}
float newRandomX() {
float rand_X = newRandom() / 100.0f;
for (int n = 0; n > 0; n++) {
if (rand_X < 0.0f && rand_X > -0.2f) {
rand_X = newRandom() / 100.0f;
}
else if (rand_X > 0.0f && rand_X < 0.2f) {
rand_X = newRandom() / 100.0f;
}
else {
return rand_X;
}
}
}
int main()
{
float dir_x = newRandomX();
std::cout << dir_x;
}
我通常在 main() 的右括号处设置一个断点,这是我在控制台中的输出 window, -nan(ind)
正如我所说,我正在学习这门语言,所以我可能正在做一些非常愚蠢的事情。非常感谢您的帮助!
将您的 newRandomX()
更改为:
float newRandomX() {
float rand_X = newRandom() / 100.0f;
while(rand_X > -0.2f && rand_X < 0.2f) {
rand_X = newRandom() / 100.0f;
}
return rand_X;
}
输出:
0.75
-0.93
-0.43
-0.82
您当前的代码将只生成两位十进制数字(注意:四舍五入到浮点格式支持的最接近的值)。为了获得更好的分布(即更多位数),您应该将整数范围扩展得更大,然后除以比 100.0f 更高的数字。
此外,不需要 while 循环。我建议改用 if 语句。
假设您的 newRandom 生成一个 [-80:80] 范围内的整数而不是 [-100:100],那么您可以这样做:
float newRandomX() {
float rand_X = newRandom() / 100.0f;
if (rand_X < 0) {
rand_X = rand_x - 0.2;
} else {
rand_X = rand_X + 0.2;
}
return rand_X;
}
如上所述,我还建议使用更大的整数范围。
我正在学习 C++,我正在尝试生成一个随机浮点数,但似乎遇到了一些困难。
我首先创建一个介于 -100 和 100 之间的随机 int(),newRandom,然后我将那个 newRandom 变成一个随机浮点数,rand_X,介于 -1.0 和 1.0 之间。唯一需要注意的是我不希望 rand_X 在 -0.2 和 0.2 之间,换句话说,
-1.0 <= rand_X <= -0.2 和 0.2 <= rand_X <= 1.0。
这是我的代码,
#include "stdafx.h"
#include <iostream>
#include <random>
int newRandom() {
int newRandom = 0;
std::random_device rd; // obtain a random number from hardware
std::mt19937 eng(rd()); // seed the generator
std::uniform_int_distribution<> distr(-100, 100); // define the range
newRandom = distr(eng);
return newRandom;
}
float newRandomX() {
float rand_X = newRandom() / 100.0f;
for (int n = 0; n > 0; n++) {
if (rand_X < 0.0f && rand_X > -0.2f) {
rand_X = newRandom() / 100.0f;
}
else if (rand_X > 0.0f && rand_X < 0.2f) {
rand_X = newRandom() / 100.0f;
}
else {
return rand_X;
}
}
}
int main()
{
float dir_x = newRandomX();
std::cout << dir_x;
}
我通常在 main() 的右括号处设置一个断点,这是我在控制台中的输出 window, -nan(ind)
正如我所说,我正在学习这门语言,所以我可能正在做一些非常愚蠢的事情。非常感谢您的帮助!
将您的 newRandomX()
更改为:
float newRandomX() {
float rand_X = newRandom() / 100.0f;
while(rand_X > -0.2f && rand_X < 0.2f) {
rand_X = newRandom() / 100.0f;
}
return rand_X;
}
输出:
0.75
-0.93
-0.43
-0.82
您当前的代码将只生成两位十进制数字(注意:四舍五入到浮点格式支持的最接近的值)。为了获得更好的分布(即更多位数),您应该将整数范围扩展得更大,然后除以比 100.0f 更高的数字。
此外,不需要 while 循环。我建议改用 if 语句。
假设您的 newRandom 生成一个 [-80:80] 范围内的整数而不是 [-100:100],那么您可以这样做:
float newRandomX() {
float rand_X = newRandom() / 100.0f;
if (rand_X < 0) {
rand_X = rand_x - 0.2;
} else {
rand_X = rand_X + 0.2;
}
return rand_X;
}
如上所述,我还建议使用更大的整数范围。