C ++如何从1到12获得随机值?

时间:2010-02-12 19:20:49

标签: c++ random

如何从1到12获取C ++随机值?

所以我会有3个,6个或11个?

5 个答案:

答案 0 :(得分:15)

使用以下公式:

M + rand() / (RAND_MAX / (N - M + 1) + 1), M = 1, N = 12

并阅读此FAQ

编辑:关于这个问题的大多数答案没有考虑到差的PRN生成器(通常提供库函数rand())在低阶位中不是非常随机的事实。因此:

rand() % 12 + 1

不够好。

答案 1 :(得分:9)

#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;
mr和dirk轻轻的评论之后

编辑

答案 2 :(得分:3)

在这种情况下对前导零有一些意义吗?你打算将它作为八进制,所以12真的是10(基数为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

然而,无论哪种方式,我们最终得到的列之一的数字比其他任何一列多一个。 10除以3将始终具有1的余数,因此无论我们如何划分数字,我们总是会有一个余数使得其中一个输出比其他输出更常见。

上面代码的基本思想非常简单:在得到一个数字并计算出一个“表格”中的位置之后,该数字会落在哪一个上面,它会检查我们得到的数字是否是“奇数”。如果是,则执行循环的另一次迭代以获得另一个数字。

还有其他方法可以做到。例如,您可以从计算仍然在随机数生成器范围内的范围大小的最大倍数开始,并重复生成数字,直到您得到一个小于该数字,然后除以您收到的数字以使其向右移动范围。从理论上讲,这甚至可以略微提高效率(它避免将随机数除以使其进入正确的范围,直到它得到一个随机数,它将会使用)。实际上,绝大多数时候,循环只会执行一次迭代,所以我们在循环内部或外部执行的内容差别很小。

答案 3 :(得分:1)

您可以这样做,例如:

#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);

答案 4 :(得分:-1)

  

(rand()%12 + 1).ToString(“D2”)