繁体   English   中英

如何在 C 中生成 5 到 40000 之间的随机数?

[英]How can i generate random numbers between 5 and 40000 in C?

我尝试使用 rand() function 生成 5 到 40000 之间的随机数。并将它们添加到 3x3 矩阵中。 我试过用 rand 乘以 rand 和 mod 39996 你认为是正确的解决方案吗?

这是代码

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

int main()
{
srand(time(0));

int **matris;

matris=(int **)calloc(3,sizeof(int));   // ilk pointerla 3 kutuya boldum yani 3 satir

for(int i=0;i<3;i++){

    matris[i]=calloc(3,sizeof(int));   // buradada 3 kutunun herbirinin icini 3e boldum
}

for(int i=0;i<3;i++){             // i= matrisin satirini j= matrisin sutununu temsil ediyor
    for(int j=0;j<3;j++){
        matris[i][j]= 5 + ((rand()*rand())%39996); // burada rand() fonksiyonunun karesini alip isleme devam ettim. 5 ile 40000 arasi sayilar olusturuyor.
    }
}

for(int i=0;i<3;i++){
    for(int j=0;j<3;j++){
        printf("%d\t",matris[i][j]);
    }
    printf("\n");

}

return 0;

}

RAND_MAX很大时,以下就足够了,尽管它有偏差。

matris[i][j] = 5 + (rand() % 39996);

由于RAND_MAX可能只有 32767(显然在OP 的情况下),我们需要更多的随机位。

if (RAND_MAX == 32767) {
  long r = rand();
  r *= (RAND_MAX + 1L);
  r += rand();
  matris[i][j] = 5 + (r % 39996);
} else {
  matris[i][j] = 5 + (rand() % 39996);
}

rand()*rand()不形成均匀分布。 在这种情况下,我们需要(RAND_MAX+1)*(RAND_MAX+1)不同的值。

生成的随机数范围至少需要为 [0...39996)。

https://www.geeksforgeeks.org/generating-random-number-range-c/

由于 C 没有内置的 function 用于生成该范围内的数字,但它确实有 rand function 从 RAND_MAX 0 生成随机数。 rand()的帮助下,可以生成范围内的数字num = (rand() % (upper – lower + 1)) + lower

如果您不担心偏见 (*)

randomvalue = rand() % 39996 + 5;

*某些值被选中的概率高于其他值*


RAND_MAX是 32767

嗯……

调用rand()两次并使用其中一个值中的一位

// return unbiased random between 5 and 40000
// assuming RAND_MAX == 32767
int unbiased(void) {
    int value;
    do {
        value = rand(); // 0 to 32767
        value = value * 2; // even value from 0 to 65534
        if (rand() & 0x800) value = value + 1; // 0 to 65535
    } while (value > 39995); // ignore biased results
    return value + 5;
}
int random(int min, int max) {
    return (rand() % (max - min + 1)) + min; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM