rand() returns 相同的值,即使在 srand 之后
rand() returns the same value, even after a srand
我正在尝试获取一个随机值,但这不起作用。
我用这个举例
srand(time(NULL) ^ getpid());
int a = rand() % 100;
我第一次得到一个随机值,但每次调用 rand() 时,我都得到相同的值。
我的完整代码:
Worms::Worms(std::string const& name, Ogre::SceneManager *scene,
Ogre::ColourValue &color, unsigned char hp) :
_name(name), _hp(hp), _scene(scene), _color(color)
{
srand(time(NULL) ^ getpid());
std::cout << "creating worms" << name << std::endl;
std::cout << color << std::endl;
this->_ent = scene->createEntity(name, "Worm.mesh");
this->generatePosition();
this->setColor(color);
}
void Worms::generatePosition()
{
int a = rand() % 10;
std::cout << a << std::endl;
Ogre::Vector3 pos(rand() % 800 + 100 , 450, 0);
std::cout << pos << std::endl;
this->_node = this->_scene->getRootSceneNode()->createChildSceneNode(this->_name);
this->_node->attachObject(this->_ent);
this->_node->showBoundingBox(true);
this->_node->scale(_node->getScale() * 4);
_node->rotate(Ogre::Vector3::UNIT_X, Ogre::Degree(90));
_node->rotate(Ogre::Vector3::UNIT_Z, Ogre::Degree(90));
_node->setPosition(pos);
}
输出:
4
Vector3(498, 450, 0)
creating worms K04L4_1
creating wormsK04L4_1 Captain_2
ColourValue(1, 0, 0, 0)
4
Vector3(498, 450, 0)
creating worms K04L4_1
creating wormsK04L4_1 Captain_3
ColourValue(1, 0, 0, 0)
4
Vector3(498, 450, 0)
creating worms K04L4_1
ok
creating wormsOP3X_2 Pride_1
ColourValue(0, 1, 0, 0)
4
Vector3(498, 450, 0)
creating worms OP3X_2
creating wormsOP3X_2 Captain_2
ColourValue(0, 1, 0, 0)
我在我的程序中多次使用 srand(),现在我在我的 main() 函数中调用它一次并且工作正常。
time(NULL)
只有第二个分辨率,因此如果您的函数在同一秒内被调用,它将始终使用相同的种子。尝试 GetTickCount()
毫秒分辨率或将微秒 ticks
传递给 srand()
using namespace std::chrono;
auto ticks = time_point_cast<microseconds>(system_clock::now()).time_since_epoch().count();
从 64 位到 32 位的向下转换(srand()
采用 32 位参数)特定于编译器,但它通常会丢弃高位位,这是您想要获得更随机种子的位。
正如你所说,你可以调用一次srand()
,然后继续调用rand()
。然后,您将逐步完成整个伪随机序列。
我正在尝试获取一个随机值,但这不起作用。
我用这个举例
srand(time(NULL) ^ getpid());
int a = rand() % 100;
我第一次得到一个随机值,但每次调用 rand() 时,我都得到相同的值。
我的完整代码:
Worms::Worms(std::string const& name, Ogre::SceneManager *scene,
Ogre::ColourValue &color, unsigned char hp) :
_name(name), _hp(hp), _scene(scene), _color(color)
{
srand(time(NULL) ^ getpid());
std::cout << "creating worms" << name << std::endl;
std::cout << color << std::endl;
this->_ent = scene->createEntity(name, "Worm.mesh");
this->generatePosition();
this->setColor(color);
}
void Worms::generatePosition()
{
int a = rand() % 10;
std::cout << a << std::endl;
Ogre::Vector3 pos(rand() % 800 + 100 , 450, 0);
std::cout << pos << std::endl;
this->_node = this->_scene->getRootSceneNode()->createChildSceneNode(this->_name);
this->_node->attachObject(this->_ent);
this->_node->showBoundingBox(true);
this->_node->scale(_node->getScale() * 4);
_node->rotate(Ogre::Vector3::UNIT_X, Ogre::Degree(90));
_node->rotate(Ogre::Vector3::UNIT_Z, Ogre::Degree(90));
_node->setPosition(pos);
}
输出:
4
Vector3(498, 450, 0)
creating worms K04L4_1
creating wormsK04L4_1 Captain_2
ColourValue(1, 0, 0, 0)
4
Vector3(498, 450, 0)
creating worms K04L4_1
creating wormsK04L4_1 Captain_3
ColourValue(1, 0, 0, 0)
4
Vector3(498, 450, 0)
creating worms K04L4_1
ok
creating wormsOP3X_2 Pride_1
ColourValue(0, 1, 0, 0)
4
Vector3(498, 450, 0)
creating worms OP3X_2
creating wormsOP3X_2 Captain_2
ColourValue(0, 1, 0, 0)
我在我的程序中多次使用 srand(),现在我在我的 main() 函数中调用它一次并且工作正常。
time(NULL)
只有第二个分辨率,因此如果您的函数在同一秒内被调用,它将始终使用相同的种子。尝试 GetTickCount()
毫秒分辨率或将微秒 ticks
传递给 srand()
using namespace std::chrono;
auto ticks = time_point_cast<microseconds>(system_clock::now()).time_since_epoch().count();
从 64 位到 32 位的向下转换(srand()
采用 32 位参数)特定于编译器,但它通常会丢弃高位位,这是您想要获得更随机种子的位。
正如你所说,你可以调用一次srand()
,然后继续调用rand()
。然后,您将逐步完成整个伪随机序列。