rand() 每次都给出几乎相同的数字 [英] rand() gives almost the same number every time

查看:90
本文介绍了rand() 每次都给出几乎相同的数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在学习 C,我想生成一个 0 到 6400 之间的数字.这是我想出的代码:

I'm learning C and I want to generate a number between 0 and 6400. This is the code I came up with:

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

int main()
{
    srand(time(0));
    int i = (rand() % 6401);
    printf("Random number between 0 and 6400: %d\n", i);
    return 0;
}

当我从命令行编译并运行这段代码时,我得到了一些非常奇怪的结果:

When I compile and run this code from the command line I get some very weird results:

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6282

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6282

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6285

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6285

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6289

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6289

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6292

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6292

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6295

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6298

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6298

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6302

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6302

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6305

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6305

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6308

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6308

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6311

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6311

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6315

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6315

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6318

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6318

K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6321

K:\C\Labo\Oefeningen 2019>

数字都不同,但我希望在 0 和 6400 之间的分布有些均匀.奇怪的是,我在一小时前使用相同的函数没有问题?(我之前用它来生成较小的数字.)我确定我错过了一些非常愚蠢的东西,但我现在已经被困了一个小时.

The numbers are all different but I would expect a somewhat even distribution between 0 and 6400. The weird thing is that I was using the same function without problems an hour ago? (I was using it to generate smaller numbers before.) I'm certain it's something really stupid that I'm missing but I've been stuck for an hour now.

我知道当您在同一秒内运行代码时,它会给出相同的值.我在两次执行之间等了几秒钟(10-20),但仍然得到相同的结果?这些值很少相同,它们在 100% 的情况下非常非常相似.我该如何解决这个问题?

I know It will give the same value when you run the code within the same second. I waited multiple seconds (10-20) between executions and I still get the same result? The values are rarely the same, they are just very very very similar 100 % of the time. How do I get around this?

推荐答案

rand 生成的数字并不是真正随机的,它们是通过公式生成的.这就是为什么播种既可能又必要的原因.根据所使用的公式,种子与前几个随机数之间可能存在高度相关性.

The numbers generated by rand aren't truly random, they're generated with a formula. That's why seeding is both possible and necessary. Depending on the formula used, there can be a high correlation between the seed and the first few random numbers.

解决方法是使用更好的公式(不是rand),使用更随机的种子,或者在播种后浪费一些随机数.

The cures are to use a better formula (something not rand), use a more random seed, or waste a few random numbers just after seeding.

这篇关于rand() 每次都给出几乎相同的数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆