我如何在C++中获取1到12的随机值?
这样我就可以得到3、6或11?
请使用以下公式:
M + rand() / (RAND_MAX / (N - M + 1) + 1), M = 1, N = 12
阅读此FAQ,以了解更多信息。
编辑:这个问题的大多数答案没有考虑到差劲的伪随机数生成器(通常由库函数rand()
提供)在低位上不太随机。因此:
rand() % 12 + 1
不够好。
rand()
以相等的概率产生所有数字直到RAND_MAX,除非RAND_MAX恰好是12的倍数(在消失得很少的情况下),否则这将不会产生1到12的数字具有相等的概率。 - Jerry Coffin#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <time.h>
// initialize random seed
srand( time(NULL) );
// generate random number
int randomNumber = rand() % 12 + 1;
// output, as you seem to wan a '0'
cout << setfill ('0') << setw (2) << randomNumber;
// generate random number
int randomNumber = rand()>>4; // get rid of the first 4 bits
// get the value
randomNumer = randomNumer % 12 + 1;
编辑:在mre和dirkgently的评论后进行了修改。
在这种情况下,前导零有什么意义吗?您是否打算将其转换为八进制,因此12
实际上是10(在十进制中)?
在指定范围内获取随机数相当简单:
int rand_lim(int limit) {
/* return a random number between 0 and limit inclusive.
*/
int divisor = RAND_MAX/(limit+1);
int retval;
do {
retval = rand() / divisor;
} while (retval > limit);
return retval;
}
while循环是为了防止偏斜的结果--一些输出比其他输出更常见。当你直接使用除法(或其余数)时,会出现偏斜的结果几乎是不可避免的。
如果想要打印出来使得个位数也显示两位数(即前导0),可以这样做:
std::cout << std::setw(2) << std::setprecision(2) << std::setfill('0') << number;
编辑:为什么这样可以工作,以及为什么需要while循环(或类似的东西),考虑一个非常有限的生成器版本,它只产生从0到9的数字。进一步假设我们希望在0到2的范围内获得数字。我们可以将数字基本上排列在一个表格中:
0 1 2
3 4 5
6 7 8
9
根据我们的喜好,我们可以将数字排列在列中:
0 3 6
1 4 7
2 5 8
9
你可以这样做:
#include <cstdlib>
#include <cstdio>
#include <time.h>
int main(int argc, char **argv)
{
srand(time(0));
printf("Random number between 1 and 12: %d", (rand() % 12) + 1);
}
srand
函数将使用当前时间(以秒为单位)来初始化随机数生成器 - 这通常是这样做的方式,但也有更安全的解决方案。
rand() % 12
将给你一个0到11之间的数字(%
是模运算符),所以我们在这里加1以得到你想要的1到12的范围。
为了打印出01 02 03等而不是1 2 3,你可以格式化输出:
printf("Random number between 01 and 12: %02d", (rand() % 12) + 1);
int Random(){ return 4; /*Guaranteed random -- Determined by dice roll */ }
这段代码吗? - Earlz