gpt4 book ai didi

c - C中的长随机数

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:25 25 4
gpt4 key购买 nike

我的问题真的很简单(也许很愚蠢)。我需要一个很长的随机数,用C语言尽可能简单。我通过互联网进行了研究,找不到任何可以帮助我的东西。我唯一能找到的是 rand() 函数无法处理大于 32,767 的数字。

这是我的部分代码,长数应该在 0 到 1,000,000 之间:

#include <stdio.h>
#include <time.h>
#include <conio.h>

#define MAX 999999

void main()
{
int i;

printf("\n Just a test with random numbers.");

printf("\n ------------------------------------\n\n");

srand(time(NULL));

for(i = 0; i < 50; i++)
{
printf(" %li\n", rand() % MAX+1);
}

printf("\n ====================================\n");
getch();
}

最佳答案

您可以通过对 rand() 的多个调用进行或运算来构建更大的数字。

#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

#define LIMIT (1000000)

static uint16_t highest_bit(uint64_t v) {
uint16_t out = 0;
while (v > 0) {
v >>= 1;
++out;
}
return out;
}

uint32_t myrand() {
static bool init = 0;
static uint16_t n;
static uint16_t shift;
if (!init) {
uint16_t randbits = highest_bit(RAND_MAX + (uint64_t)1L);
uint16_t outbits = highest_bit(LIMIT);
n = (outbits + randbits - 1)/randbits;
shift = randbits;
init = 1;
}
uint32_t out = 0;
for (uint16_t i=0; i<n; ++i) {
out |= rand() << (i*shift);
}
return out % LIMIT;
}

应该注意的是,这种方法会有偏差(即所有数字的概率都不相同),而且绝对不是加密安全的。如果你想要那样,你根本不应该使用 rand()

这里有一个小的主要函数来测试所有数字至少可能得到:

int main() {
bool* seen = calloc(LIMIT, sizeof(bool));
if (!seen) {
fprintf(stderr, "failed to malloc 'seen' array\n");
return 1;
}
uint32_t nseen = 0;
uint32_t ntries = 0;
// this could take a long time -- you can use Ctrl-C to abort a command-line program
while (nseen < LIMIT) {
if ((ntries & 0xffff) == 0) {
printf("after %u tries, we've seen %u different numbers.\n", ntries, nseen);
}
++ntries;
uint32_t r = myrand();
if (!seen[r]) {
seen[r] = true;
++nseen;
}
}
printf("Found them all after %u tries!\n", ntries);
return 0;
}

关于c - C中的长随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37760803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com