gpt4 book ai didi

c - 为什么我的 C 代码只生成每三个随机数?

转载 作者:行者123 更新时间:2023-12-01 13:15:42 24 4
gpt4 key购买 nike

我正在尝试模拟蠕虫在由 100,000 台计算机组成的网络中的传播。模拟本身非常简单,我不需要任何帮助,除了出于某种原因,我只得到每三个随机数。

只有索引对1000取模小于10的计算机才能被感染,所以当1000台计算机被感染时,程序就可以完成。由于某种原因,我的程序只得到 329。当我降低目标数并检查数组的内容时,只有每三台计算机发生变化,这是一个一致的模式。例如,在数组的末尾,只有计算机 98001、98004、98007、99002、99005、99008 被更改,即使它们之间的计算机(98002、98003 等)也应该被更改。该模式一直保持到数组的开头。当我尝试更改所有 1000 时,程序进入无限循环并卡在 329。

编辑:我刚刚发现,如果我将 NETSIZE 降低到 10,000 并将 while 循环中的目标降低到 100,它不会跳过任何内容。这是否意味着问题与舍入误差有关?比我更懂 C 的人一定知道答案。

谢谢。

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

#define NETSIZE 100000

double rand01();
void initNetwork();

unsigned char network[NETSIZE];
int scanrate = 3;
int infectedCount;
int scans;
int ind;
int time;



int main(void) {
initNetwork();
time = 0;
infectedCount = 1;
while (infectedCount < 1000) { //changing 1000 to 329 stops the infinite loop
scans = infectedCount * scanrate;
for (int j = 0; j < scans; j++) {
ind = (int) (rand01() * NETSIZE);
if (network[ind] == 0) {
network[ind] = 1;
infectedCount++;
}
}
time++;
}
for (int k = 0; k < NETSIZE; k++) {
if (network[k] == 1) printf("%d at %d\n", network[k], k);
}
}
double rand01() {
double temp;
temp = (rand() + 0.1) / (RAND_MAX + 1.0);
return temp;
}

void initNetwork() {
for (int i = 0; i < NETSIZE; i++) {
if (i % 1000 < 10) {
network[i] = 0;
} else {
network[i] = 2;
}
}
network[1000] = 1;
}

在上面的代码中,我希望代码一直运行到 1000 个易受攻击的索引从 0 变为 1。

最佳答案

将评论转化为答案。

您系统上的 RAND_MAX 是什么?如果它是 15 位或 16 位值,则在转换为 double 时可能无法获得足够好的量化。如果它是 31 位或更大的数字,那(可能)就不是问题。您需要调查仅由具有不同种子的 rand01() 函数生成的值,加上乘法和转换为整数 — 只需打印结果并 sort -n | uniq -c 查看结果的统一程度。

On my system RAND_MAX is only 32767. Do you think that might be why my results might not be granular enough? Now that you've made me think about it, there would only be 32,767 possible values and my network array is 100,000 possible values. Which corresponds about about the 1/3 results I am getting.

是的,我认为这很可能是问题所在。您想要 100,000 个不同的值,但您的随机数生成器只能生成大约 33,000 个不同的值,这非常接近您的 1:3 指标。它还立即解释了为什么当您将乘数从 100,000 减少到 10,000 时会得到好的结果。

你可以试试:

double rand01(void)
{
assert(RAND_MAX == 32767);
return ((rand() << 15) + rand()) / ((RAND_MAX + 1.0) * (RAND_MAX + 1.0));
}

或者您可以使用替代的随机数生成器——例如,POSIX 定义了 drand48()函数族和 random() , 在需要时具有相应的种子设定功能。

关于c - 为什么我的 C 代码只生成每三个随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55366874/

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