产生在一个范围C ++的随机数[复制](generate random number in a ra

2019-10-21 03:15发布

这个问题已经在这里有一个答案:

  • 如何模量和RAND()工作? 4个回答

我使用的是ncurses库建立一个游戏。 我无法生成正确的随机数。 下面的while循环需要保持,直到他们在1和45之间产生随机数(这是标准的屏幕上我的y轴限制)。 我想不通,我做错了什么,因为while循环条件看起来好像没什么问题。 问题是,while循环开始无限运行。 林没有做任何事情,但最后打印生成的数字,因为我只是想看看正确的数字产生。 任何人都可以请帮我解决这个问题? 以下是我的INT为主。

int main()
{
int r,c,x=0;
initscr();
raw();
keypad(stdscr, TRUE);
noecho();
//mvprintw(22,45,"<");
getmaxyx(stdscr,r,c);

int n,n2 = 0;

while((n<1)||(n>45)){
srand (time(NULL));
n = rand();
srand (time(NULL));
n2 = rand();
}
mvprintw(4,10,"First Random Number: %d\n", n);
mvprintw(5,10,"Second Random number: %d\n", n2);

getch();
endwin();
return 0;
}

Answer 1:

这是你如何能在C ++中做到这一点:

#include <iostream>
#include <random>

int main()
{
    std::random_device rd;
    std::mt19937 gen( rd());
    std::uniform_int_distribution<> dis( 1, 45);

    for (int n=0; n<1000; ++n)
        std::cout << dis(gen) << ' ';
    std::cout << '\n';
}

使用rand() % x是因为BE分割的范围内不是均匀引入的偏压的一个有缺陷的设计。 你可以阅读这个详细了解所引入的偏置rand() % x



Answer 2:

你想打电话给srand在事情开始一次 ,然后用模带来rand结果到你的范围,是这样的:

srand(time(NULL));
n  = rand() % 45 + 1;
n2 = rand() % 45 + 1;


Answer 3:

就像@unholySheep评论,RAND()返回一个0到RAND_MAX之间的值,它巨大的价值。 因此,这是不太可能,你会很快得到1和RAND_MAX之间的值。

因此,解决的办法是通过做你想要的号码师提醒:

 n = 1 + rand() % 45;

你甚至都不需要一段时间。



Answer 4:

你可以得到1和45包容着之间的随机数:

n = rand() % 45 + 1;

这不会是完美的分布方面,但它会是谁的人既不是统计学家,也不是密码破译,在这种情况下,你可能会使用真正的随机数非常接近。

你也应该调用srand()一次,在程序开始的地方,而不是多次,特别是如果你使用当前播种了。

多次做同一秒钟之内会给你一个明确的非随机序列,例如:

42, 42, 42, 42, 42, 42, 42, ...


文章来源: generate random number in a range c++ [duplicate]
标签: c++ c random