【问题标题】:Rand() not generating random variables in CRand() 不在 C 中生成随机变量
【发布时间】:2018-03-24 05:22:35
【问题描述】:

我一直在尝试应用在此站点上找到的所有建议,但似乎没有一个有效。

对于代码的第一部分,我需要用随机数(0 或 1)填充一个数组来模拟流行病的传播,但得到的数组根本不是想要的……这是我写的代码:

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

int main(int argc, char **argv)
{
    int N, BC, t, T, i, v[N];
    float b, g, p, r;

    /*Variable values initialization*/
    printf("Enter infection probability:\n");
    scanf("%f", &b);

    printf("Enter the number of individuals:\n");
    scanf("%d", &N);

    printf("Enter the number of time steps:\n");
    scanf("%d", &T);

    printf("Periodic boundary contitions? (Y:1 / N:0)\n");
    scanf("%d", &BC);   


    /*First set of individuals*/
    srand(time(NULL));
    for(i = 0; i < N; i++){ 
    v[i] = (rand()/RAND_MAX);
    }

    /*Check if array properly initialized*/
    printf("Initial array:\n" );
    for(i = 0; i < N; i++){
        printf("%d-", v[i]);
    }

我对数组的预期结果类似于:1-0-1-1-0-0-0-...,但我总是得到以下结果:

初始数组: 0-0-2-15-0-0-0-0-0-0-

我做错了什么?

谢谢一百万!

【问题讨论】:

  • 使用变量N定义数组v时,N的值是多少?当您初始化 N 时,定义不会追溯地“重新制定”。总之你有undefined behavior
  • 除此之外,rand()/RAND_MAX 仅在 rand() 恰好返回 RAND_MAX 时才给出 1。可能不是你想要的。
  • 你的编译器应该明确地警告你这一点。尝试提高警告级别。例如,使用 gcc 这将是 -Wall.
  • 另外,v[N] 是一个整数数组,你分配 rand()/RAND_MAX,当你除以整数时,它大部分时间都是 0。只有当 rand() 产生 RAND_MAX 你才会得到一个 - 这基本上是永远不会的。

标签: c arrays random


【解决方案1】:

你应该在之后声明v[N]

printf("Enter the number of individuals:\n");
scanf("%d", &N);

否则它的大小将是随机的,因为在设置基于Nv[] 分配的内存时,N 不会被初始化。

如果您只想要01,您应该使用模数:

srand(time(NULL));
for(i = 0; i < N; i++){ 
    v[i] = (rand() % 2);
}

rand 生成的所有偶数将变为0,所有奇数将变为1

【讨论】:

  • 现在不太可能,但rand() 的一些 PRNG 实现对于最低有效位并不是很随机,因此最好先转换。
  • "它的大小将是随机的"
  • 到例如总是使用第 1 位,你可以写 v[i] = !!(rand() &amp; 2);
猜你喜欢
  • 2015-05-09
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多