C++ 使用C+生成-30到30之间的数字+;

C++ 使用C+生成-30到30之间的数字+;,c++,C++,我想生成-30到30之间的数字 我已经在中尝试了该解决方案,它给了我以下结果: 111875657664 151875657664 211875657664 -41875657664 -151875657664 171875657664 -201875657664 -131875657664 -301875657664 -271875657664 这是我的职责: int Random::genRandom() { int rnd; rnd = (rand()%61)-30;

我想生成-30到30之间的数字

我已经在中尝试了该解决方案,它给了我以下结果:

111875657664
151875657664
211875657664
-41875657664
-151875657664
171875657664
-201875657664
-131875657664
-301875657664
-271875657664
这是我的职责:

int Random::genRandom() {
    int rnd;
    rnd = (rand()%61)-30;
    return rnd;
}
这是主要的源文件:

#include "Random.h"
#include <iostream>
using namespace std;

int main() {
    Random random;
    int randomas;
    for(int i=0; i<10; i++) {
        randomas = random.genRandom();
        cout << randomas << "\n";
    }
    return 0;
}
#包括“Random.h”
#包括
使用名称空间std;
int main(){
随机;
随机数;
对于(int i=0;i请尝试以下方法:

srand (time(NULL));
for(int i = 0;  i < 10; i++)
{
    int rnd;
    rnd = rand() % (60) - 30;

    cout << rnd << std::endl;
}
srand(时间(空));
对于(int i=0;i<10;i++)
{
int rnd;
rnd=rand()%(60)-30;

试试这段代码。这是一个线性同余生成器在你的问题上的应用。这个生成器有很好的特性

#include <iostream>

int main( int argc,char** argv )
{
//the seed, an arbitrary initial value
int seed = 338;

//these constants define a linear congruence generator
int modulus = 2147483399;
int multiplicator = 40692;
int m = 52774;
int l = 3791;

//additional variables
double max = static_cast<double>( modulus );
double value;

//number of random numbers
int N = 20;

//random number generation
int lcg_value = seed;

int k1;
int z;

for( int i = 0; i < N; ++i )
{
    k1 = lcg_value / m;
    z = multiplicator * ( lcg_value - k1 * m ) - k1 * l;

    if( z < 0 )
    {
        z = z + modulus;
    }

    lcg_value = z;

    //random number, lies between 0.0 and 1.0
    value = static_cast<double>( lcg_value ) / max;

    //print random number, lies between -30.0 and 30.0
    std::cout << ( 60.0 * value - 30.0 ) << std::endl;
}

return( 0 );
}
#包括
int main(int argc,字符**argv)
{
//种子,一个任意的初始值
int seed=338;
//这些常数定义了线性同余生成器
int模数=2147483399;
整数乘法器=40692;
int m=52774;
int l=3791;
//附加变量
双倍最大值=静态浇铸(模数);
双重价值;
//随机数
int N=20;
//随机数生成
int lcg_值=种子;
int k1;
intz;
对于(int i=0;istd::cout这对解决OP的bizarro数问题(我似乎无法重现)没有任何作用,只是为了让它出现。C++11和better提供了许多不同的方法来解决
rand
的问题

一、 首先,欢迎我们的朋友

#包括
#包括
int main()
{
std::随机_装置;
//构建用于播种的随机数生成器
std::默认的随机引擎(设备());
//没什么特别的。假设编译器实现者知道他们在做什么
//用上面的一个很好的随机数播种它。
标准:均匀分布(-30,30);
//生成从-30到30的均匀分布数字
随机数;

对于(int i=0;i您如何打印这些数字?请发布实际再现问题的最小代码。@SJuan76请检查更新。@πάνταῥεῖ 这怎么会导致数字超出预期范围?这与OP发布的几乎相同,唯一的区别是你现在从生成的数字中排除了30。但这会生成范围为-30到30的数字。这是OP想要的,对吗?OP的代码也一样。至少是他上面发布的代码,对吗他到底有没有实际的代码我们还不知道。不,这会产生从-30到29(包括)的数字,OP显然已经尝试过了,但没有效果。你真的认为问题在于他使用的是内置的
rand()
而编写自己的RNG是解决方案吗?这个答案并不能解释op得到的错误结果。我还怀疑在std::linear_Congressional_引擎存在的情况下,建议op实现自己的线性同余生成器的优点。随机数生成不仅仅是编写无bug代码。如果你是serio关于生成随机数,必须编写自己的实现。发生了许多不好的事情,导致人们盲目使用rand()因此,我发现指出编写生成器并不难是一个可行的选择:您拥有完全的控制权,对于这个生成器,您可以依靠科学出版物证明生成器具有出色的数学特性。“必须编写自己的实现。”-嗯,不,在标准的
标题中有预先编写的无bug实现,无需滚动自己的实现(可能会在过程中引入一些bug)。使用
rand()
不好,但运行自己的生成器也不是更好。是的,您可以获得大量的控制,但大量的控制带来了巨大的责任,也带来了巨大的潜在错误。99.9%的时间,您可以很好地使用现有的实现。rand()可以自由使用它喜欢的任何实现,这就是它导致问题的原因。它保证使用特定的算法,甚至为推荐的同行评审参数提供typedefs。如果您有权访问它,实际上不需要复制代码。您忘了为std::default\u random\u引擎设置种子。您可能应该使用std::random_设备。是的,刚刚发现了。有趣的是cppreference和cplusplus之间的差异。没有它似乎可以工作,但可能有一些讨厌的副作用,我要等到他妈的太晚才会看到。不管怎样,修复了。没有它也可以工作,但你总是会有相同的默认种子(可能),所以你总是会得到相同的随机数集。
#include <iostream>
#include <random>

int main()
{
    std::random_device device;
    // build a random number generator for seeding
    std::default_random_engine engine(device()); 
    // nothing fancy. Assuming the compiler implementors know what they are doing
    // seeding it with a nice random number from above.
    std::uniform_int_distribution<int> distribution(-30, 30);
    // generate uniformly distributed numbers from -30 to 30

    int randomas;
    for(int i=0; i<10; i++) {
        randomas = distribution(engine); // Bless me with a number, divine masters!
        std::cout << randomas << "\n"; // Witness the number all shiny and chrome!
    }
    return 0;
}