我使用的是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;
}
这是你如何能在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
。
你想打电话给srand
在事情开始一次 ,然后用模带来rand
结果到你的范围,是这样的:
srand(time(NULL));
n = rand() % 45 + 1;
n2 = rand() % 45 + 1;
就像@unholySheep评论,RAND()返回一个0到RAND_MAX之间的值,它巨大的价值。 因此,这是不太可能,你会很快得到1和RAND_MAX之间的值。
因此,解决的办法是通过做你想要的号码师提醒:
n = 1 + rand() % 45;
你甚至都不需要一段时间。
你可以得到1和45包容着之间的随机数:
n = rand() % 45 + 1;
这不会是完美的分布方面,但它会是谁的人既不是统计学家,也不是密码破译,在这种情况下,你可能会使用真正的随机数非常接近。
你也应该调用srand()
一次,在程序开始的地方,而不是多次,特别是如果你使用当前播种了。
多次做同一秒钟之内会给你一个明确的非随机序列,例如:
42, 42, 42, 42, 42, 42, 42, ...