unsigned long long rand_atleast12digit(void) {
unsigned long long r = rand();
#if RAND_MAX >= 999999999999
#elif RAND_MAX >= 999999
r *= RAND_MAX + 1ull;
r += rand();
#else
r *= RAND_MAX + 1ull;
r += rand();
r *= RAND_MAX + 1ull;
r += rand();
#endif
return r;
}
如果范围为0到 * 至少 * 999,999,999,999,则以上代码返回一个数字。要将其缩小到该范围,代码可以使用return r % 1000000000000;。 使用%可能无法创建随机数的平衡分布。其他帖子讨论了如何科普这个问题的细节,如this good one合并如下。
#if RAND_MAX >= 999999999999
#define R12DIGIT_DIVISOR (RAND_MAX/1000000000000)
#elif RAND_MAX >= 999999
#define RAND_MAX_P1 (RAND_MAX+1LLU)
#define R12DIGIT_DIVISOR ((RAND_MAX_P1*RAND_MAX_P1-1)/1000000000000)
#else
#define RAND_MAX_P1 (RAND_MAX+1LLU)
#define R12DIGIT_DIVISOR ((RAND_MAX_P1*RAND_MAX_P1*RAND_MAX_P1-1)/1000000000000)
#endif
unsigned long long rand_12digit(void) {
unsigned long long retval;
do {
retval = rand_atleast12digit() / R12DIGIT_DIVISOR;
} while (retval == 1000000000000);
return retval;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, n;
time_t t;
n = 5;
/* Intializes random number generator int range */
srand((unsigned) time(&t));
/* Print 5 random numbers from 50 to back
for( i = 0 ; i < n ; i++ )
{
printf("%d\n", rand() % 50);
}
return(0);
}
4条答案
按热度按时间blmhpbnm1#
rand()
返回范围为[0...RAND_MAX]
的int
值基于C规范,
RAND_MAX >= 32767
和RAND_MAX <= INT_MAX
。多次调用
rand()
以创建宽值如果范围为0到 * 至少 * 999,999,999,999,则以上代码返回一个数字。要将其缩小到该范围,代码可以使用
return r % 1000000000000;
。使用
%
可能无法创建随机数的平衡分布。其他帖子讨论了如何科普这个问题的细节,如this good one合并如下。注意,
rand()
的质量没有很好地定义,因此重复调用可能不会提供高 * 质量 * 的结果。如果
long
是32位,OP的代码将失败,因为它缺少12个十进制数字值的范围。@Michael Walz如果
long
足够宽,*100
总是会产生最少2个十进制数字00
--不是很随机。nfs0ujit2#
rand is
int
的结果,这意味着您不能直接从中获得12位数。如果您需要的值总是12位数,您需要确保值适合特定的范围。
下面的示例假设您只需要一些数字为12位-您只需要8个额外的位-因此移位和OR'ing结果将产生0x 7 fffffffff-0范围内的数字,当打印为十进制时,通常会产生最多12位的输出:
PS:确保将存储结果的变量足够大,可以存储12位数字。
lbsnaicq3#
生成随机字符串或数字的简单方法是:
解释代码
1.创建一个字符数组,其中包含(数字、字母等)
1.生成一个[0,数组长度]之间的随机数,我们将其命名为X。
1.获取字符数组中随机X位置的字符。
1.最后,将这个字符添加到您希望返回的字符串(或数字)序列中。
vc9ivgsu4#