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

Mic*_*Ice 4 c++ random

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

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

dir*_*tly 15

使用以下公式:

M + rand() / (RAND_MAX / (N - M + 1) + 1), M = 1, N = 12
Run Code Online (Sandbox Code Playgroud)

并阅读此常见问题解答.

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

rand() % 12 + 1
Run Code Online (Sandbox Code Playgroud)

不够好.

  • 使用天真%方法提高统计偏差问题的+1. (3认同)
  • 使用除法本身只能提供一点改进 - 结果*可能*更随机,但它们通常仍然是偏斜的.假设`rand()`以相等的概率产生高达RAND_MAX的所有数字,这将不会以相同的概率产生1到12的数字,除了(罕见的)RAND_MAX恰好是12的倍数的情况. (2认同)

f4.*_*f4. 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;
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题可能会更好吗?

// generate random number
int randomNumber = rand()>>4; // get rid of the first 4 bits

// get the value
randomNumer = randomNumer % 12 + 1;
Run Code Online (Sandbox Code Playgroud)

在mre和dirkgently的评论后编辑

  • @Earlz:家庭作业是关于正确学习的东西.不要复制粘贴.因此,我的答案没有完整的解决方案.仅提示.一个非常非常重要的提示要记住. (4认同)
  • 差的方法,因为许多随机数发生器的低阶位令人沮丧地非随机.阅读我在答案中发布的常见问题解答. (2认同)
  • @dirkgently我敢打赌这只是家庭作业,所以他并不在乎这些数字是不是真正随机的. (2认同)