c++随机函数不随机
C++ random function not random
在我的c++代码中,我有一个问题。我的随机drawBlock函数应该返回xRandom和yRandom,但不是那么随机。
void Game::drawBlock()
{
int xRandom, yRandom;
std::cout<<time(NULL) << std::endl;
xRandom = (rand () % 620) + 1;
yRandom = (rand () % 440) + 1;
std::cout << "x: " << xRandom << std::endl;
std::cout << "y: " << yRandom;
mBlock.setSize(sf::Vector2f(20,20));
mBlock.setPosition(xRandom,yRandom);
mBlock.setFillColor(sf::Color::Red);
}
基本上发生的是第一个随机数,在这个例子中xRandom并不是真正随机的。当我运行程序时,一切看起来都很好,xRandom得到一个随机数,yRandom得到一个随机数。但是当我重新启动程序时,我的xRandom数字几乎是相同的。而我的随机数完全改变了。例如,当我开始写代码时:xRandom = 33yRandom = 381当我重新运行我的代码xRandom = 41,在重新运行10次之后,它看起来像这样:55,66,84,101,125,140,180,201,234,251奇怪的是,新的xRandom总是比上一个多。
下面是我调用srand的代码:
#include <SFML/Graphics.hpp>
#include "Game.h"
int main()
{
srand(time(0));
Game game;
game.run();
return 0;
}
您对rand()
的使用似乎比较标准。rand()
作为一个糟糕的随机数据来源而臭名昭著,也许您正在使用的实现在这种特殊方式上比通常更糟糕。您可能会找到允许您使用特定实现的解决方案,但我建议您转移到另一个随机数源。
c++ 11引入了<random>
库,它提供了有质量保证的随机工具,功能更强大、更灵活、更易于使用。当它可用时,应该优先使用它。
要在c++ 11中使用<random>
库,您需要创建并播种一个随机性源:
#include <random>
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);
然后使用'分布'从引擎中获取随机数据并产生随机数:
std::uniform_int_distribution<> dist(1, 6);
int die_roll = dist(engine);
对于您的使用,您可能会让引擎是Game
的成员:
class Game {
std::mt19937 engine;
// ...
然后在drawBlock()
:
xRandom = std::uniform_int_distribution<>(1, 620)(engine);
yRandom = std::uniform_int_distribution<>(1, 440)(engine);
我的做法如下:
int a;
srand(time(NULL));
a=rand()%100+1
它为我工作,生成一个随机数
相关文章:
- 循环中的随机函数
- 如何调用随机函数
- 如何在 C++ 中获取随机函数的周期性
- C++ Arduino - 随机函数不起作用
- 随机函数在循环中调用时返回相同的数字!C++
- C++随机函数给出的相同整数是输出的两倍
- C++编写随机函数和参数
- 在另一个函数中调用随机函数
- 如何在另一种语言的随机函数中复制C++兰特?
- C++中的随机函数
- 在RFC3711(SRTP)中,OpenSSL AES_ctr128_encrypt()作为密钥派生的伪随机函数意外输出
- 值噪声随机函数奇异输出
- 每次在 c++ 中调用的随机函数
- 是否有一个随机函数可以生成 0 到 1 之间的数字
- 调用随机函数 (C++)
- 具有内部随机函数的结构的CUDA移植
- 以给定概率生成1或0的随机函数
- 随机函数在c++和Matlab中
- 实现自己的随机函数是否被普遍接受?(c++)
- C++从随机函数中移除元素