c初学者兰德()

c初学者兰德(),c,random,C,Random,该代码已连续200次在第一次投掷时为r生成1结果;后面的投掷不是静止的;他们改变了;知道我搞砸了什么吗??使用Xcode。谢谢 #include <stdio.h> #include <stdlib.h> #include <time.h> #define tprop .5 // propability coin will be tails int main(int argc, const char *argv[]) { int i;

该代码已连续200次在第一次投掷时为r生成1结果;后面的投掷不是静止的;他们改变了;知道我搞砸了什么吗??使用Xcode。谢谢

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define tprop .5    // propability coin will be tails

int main(int argc, const char *argv[])
{
    int i;          // for loop counter
    int n;          // # of rolls
    int hc = 0;     // heads counter
    int tc = 0;     // tails counter
    int r;          // roll... 1=heads, 0=tails

    srand(time(NULL));  // seed Random# generator with current time

    printf("Enter # of times to toss a coin: ");
    scanf("%i", &n);

    for (i = 0; i < n; i++) {
        if ((float) rand() / RAND_MAX > tprop) {
            r = 1;
            hc++;
        } else {
            r = 0;
            tc++;
        }
        printf("%in", r);
    }
    printf("# of times heads came up: %i (%f%%)n", hc, (float) hc / n * 100);
    printf("# of times tails came up: %i (%f%%)n", tc, (float) tc / n * 100);

    return 0;
}
#包括
#包括
#包括
#定义tprop.5//可能性硬币将是尾部
int main(int argc,const char*argv[]
{
int i;//用于循环计数器
卷的整数n;/#
int hc=0;//头计数器
int tc=0;//尾部计数器
int r;//滚动…1=正面,0=反面
srand(time(NULL));//使用当前时间对随机#生成器进行种子设定
printf(“输入掷硬币的次数:”;
scanf(“%i”和“&n”);
对于(i=0;itprop){
r=1;
hc++;
}否则{
r=0;
tc++;
}
printf(“%in”,r);
}
printf(“头出现的次数:%i(%f%%)n”,hc,(float)hc/n*100);
printf(“#出现尾部的次数:%i(%f%%)n”,tc,(float)tc/n*100);
返回0;
}

您的测试可能已经编写好脚本,并尽可能快地运行

因此,大多数测试将在同一秒内执行

使用当前时间戳为伪随机数生成器播种,该时间戳的分辨率为1秒

您可以查看其他熵源,如Linux或BSD上的熵源。
如果在x86/x64系统上运行代码,也可以使用作为熵源。

要回答这个问题,首先我们需要看看rand()代码

发件人:

如您所见,随机值是基于种子值计算的(新的种子值是计算出来的),这就是为什么我们称这些数字为伪随机数。由于我们对第一次运行感兴趣,让我们稍微简化代码,编写一个函数,将输入作为种子,并返回第一个rand():

现在让我们使用此函数运行一个测试:

for (i = 0; i < 50; ++i) {
    printf("seed = %u; rand = %d\n", seed + i, firstRand(seed + i));
}
因此,正如您所看到的,如果种子值很接近,那么这些值可能会很接近,并且由于您使用了当前时间,因此您运行的200个测试都具有彼此接近的种子值

时间(NULL)返回当前时间(以秒为单位)。为了获得更好的结果,您应该使用以毫秒为单位的时间(如果您真的需要在两次运行之间更改很多值,请对其执行一些操作)。

Windows(此处用wine模拟)和glibc(x86_64)版本的rand完全不同,但代码将在任何地方编译。你的代码在我的Linux机器上运行得很好,但是今天,在这个时候,当使用从时间生成的种子(NULL)时,你的代码的Windows版本在第一次运行时总是为我返回1,即使我等待几分钟。也许在未来的几个小时、几天、几个月,情况会有所不同。看看这个:

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

int main (int argc, const char *argv[]) {
    int i;
    int r;
    printf ("rand() returns:\n",RAND_MAX);
    for (i = 0; i < 25; i++) {
        srand (i);
        r = rand();
        printf ("%i ", r);
    } printf ("\nout of RAND_MAX of %li\n",RAND_MAX);
    return 0;
} 
关于葡萄酒的结果(使用mingw编制):


请注意windows版本如何与种子值更紧密地耦合,因此与RAND_MAX 32767相比,它返回的结果非常低。

:-)对于超过100次的运行,第一次掷骰的结果为一头;发生这种情况的可能性小得令人难以置信,所以我假设某个地方有问题。。。我从命令行运行了它,而不是从Xcode运行了30次,除了之前的运行之外,所有的第一次抛出都是头部。sheddd-问题是什么,对于所有头部,它与任何其他组合的概率相同。我手动运行,一次一个。。。每次运行大约需要0.3秒。谢谢你的信息;我会看看你的链接!请注意,这只是
rand()
的一种可能实现。C标准提供了一个示例实现,但不需要使用它。如果在Linux或OS X上,使用
/dev/uradom
很容易。
for (i = 0; i < 50; ++i) {
    printf("seed = %u; rand = %d\n", seed + i, firstRand(seed + i));
}
seed = 1333783311; rand = 19779
seed = 1333783312; rand = 19783
seed = 1333783313; rand = 19786
seed = 1333783314; rand = 19789
seed = 1333783315; rand = 19792
seed = 1333783316; rand = 19796
seed = 1333783317; rand = 19799
seed = 1333783318; rand = 19802
seed = 1333783319; rand = 19805
seed = 1333783320; rand = 19809
seed = 1333783321; rand = 19812
seed = 1333783322; rand = 19815
seed = 1333783323; rand = 19819
seed = 1333783324; rand = 19822
seed = 1333783325; rand = 19825
seed = 1333783326; rand = 19828
seed = 1333783327; rand = 19832
seed = 1333783328; rand = 19835
seed = 1333783329; rand = 19838
seed = 1333783330; rand = 19841
seed = 1333783331; rand = 19845
seed = 1333783332; rand = 19848
seed = 1333783333; rand = 19851
seed = 1333783334; rand = 19854
seed = 1333783335; rand = 19858
seed = 1333783336; rand = 19861
seed = 1333783337; rand = 19864
seed = 1333783338; rand = 19868
seed = 1333783339; rand = 19871
seed = 1333783340; rand = 19874
seed = 1333783341; rand = 19877
seed = 1333783342; rand = 19881
seed = 1333783343; rand = 19884
seed = 1333783344; rand = 19887
seed = 1333783345; rand = 19890
seed = 1333783346; rand = 19894
seed = 1333783347; rand = 19897
seed = 1333783348; rand = 19900
seed = 1333783349; rand = 19903
seed = 1333783350; rand = 19907
seed = 1333783351; rand = 19910
seed = 1333783352; rand = 19913
seed = 1333783353; rand = 19917
seed = 1333783354; rand = 19920
seed = 1333783355; rand = 19923
seed = 1333783356; rand = 19926
seed = 1333783357; rand = 19930
seed = 1333783358; rand = 19933
seed = 1333783359; rand = 19936
seed = 1333783360; rand = 19939
#include <stdio.h>
#include <stdlib.h>

int main (int argc, const char *argv[]) {
    int i;
    int r;
    printf ("rand() returns:\n",RAND_MAX);
    for (i = 0; i < 25; i++) {
        srand (i);
        r = rand();
        printf ("%i ", r);
    } printf ("\nout of RAND_MAX of %li\n",RAND_MAX);
    return 0;
} 
rand() returns:
1804289383 1804289383 1505335290 1205554746 1968078301 590011675 290852541 1045618677 757547896 444454915 1215069295 1989311423 1687063760 1358590890 2146406683 762299093 462648444 1227918265 1995168598 623271449 319571911 1086411056 1857631170 1562469902 188364873 
out of RAND_MAX of 2147483647
rand() returns:
38 41 45 48 51 54 58 61 64 68 71 74 77 81 84 87 90 94 97 100 103 107 110 113 116 
out of RAND_MAX of 32767