【问题标题】:How to make random value function return different value each time [duplicate]如何使随机值函数每次返回不同的值[重复]
【发布时间】:2014-09-13 10:38:55
【问题描述】:

我一直在尝试编写一个小的 C 函数来生成随机值。问题是每次在 for 循环中调用函数时它都会返回相同的值。我知道问题是 srand 是用 NULL 播种的。我想知道的是如何纠正它,以便在 for 循环的每次迭代中函数返回不同的值。代码如下:

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

int randInt(int,int);

void main(){

    int min=100, max=200,i=0;

    for(i;i<11;i++){ printf("%d \n",randInt(min,max));  }

}


int randInt(int a,int b){

    srand(time(NULL));
    int randValue;
    randValue=1+(int)rand()%(b-a+1);
    return randValue;

}

如果您有解决方案或可以发布解决方案的参考,请告诉我。提前谢谢你!

编辑:遇到问题 #2,在将 srand(time(NULL)) 替换为 main 之后,现在每次迭代都会生成低于我的范围的数字,即最初我想要 100 到 200 之间的数字,但它也包括 0 到100. 正如 cmets 中所建议的,使用 randValue=a+(int)rand()%(b-a+1); 解决了这个问题

【问题讨论】:

  • 不要在随机函数中调用srand
  • 扩展退休忍者的评论。 srand 用于(一次)初始化,然后 rand 用于检索值。
  • 谢谢你,忍者,它成功了!现在,还有一个小问题 - 我正在尝试生成从 100 到 200 的数字,但是该函数生成的值低于 100。我该如何解决这个问题?
  • Bung srand(time(NULL)); 在 main 之后
  • 注意:如果代码在同一秒内执行两次,通常main() 中的srand(time(NULL)); 技巧无法“使随机值函数每次返回不同的值”。另一种方法是从文件中提取srand(seed) 中的seed 值,并在每个程序运行时递增它。有很多方法可以解决这个问题。

标签: c random srand


【解决方案1】:

srand(time(NULL)); 放在main 中,紧跟在{ 之后

要生成100-200范围内的随机数,而不是加1,加100或a

randValue=(int)rand()%(b-a+1);

所以它看起来像:

randValue=(int)rand()%(b-a+1)+100;

【讨论】:

  • 这不会解决他的第二个问题
  • 他的第二个问题是什么?问题没有其他内容了
  • 你真的应该阅读问题下的cmets
  • 他应该在他的问题中提到这一点.....
  • @Xieerqi ,您仍然可以编辑您的问题以添加它!
【解决方案2】:

这将每次打印 100-200 之间的随机值:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int randInt(int a,int b)
{
    int randValue;
    randValue = (rand() % (b-a+1)) + a;
    return randValue;
}

int main(void) {
    int r=0, i = 0;

    srand(time(NULL));
    do 
    {
        r = randInt(100,200);
        printf("%d\n",r);
        i++;
    }while(i < 11);
    puts("Done!");

    return 0;
}

【讨论】:

  • 删除了我之前的评论 +1
【解决方案3】:

我使用的是minmax 而不是ab。这对您的代码的未来读者来说更好

  1. 你应该在初始化时只使用一次srand(time(NULL)),例如在你的main()
  2. 您可能想要min + rand() % (max - min + 1) 而不是rand()%(b-a+1)

【讨论】:

  • -1 您不能在randInt 函数中使用minmax,因为它们是局部变量
  • @CoolGuy ups 仔细阅读我确实提到过
  • @chux 谢谢我更新了我的帖子。
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2021-06-30
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多