C++ C++;rand()在第一次运行时返回无意义的值,在第二次运行时工作正常 我正在做一个抽奖计划,这是我的随机化函数 #include <iostream> #include <stdlib.h> #include <time.h>// for seeding srand #include <algorithm> //for std::find #include <iterator> //for std::begin, std::end using namespace std; void rivinArvonta(int arvottuRivi[]){ int rivi[7]; int pallo = 41; srand(time(NULL)); for (int i = 0; i < 7; i++) { pallo = rand() % 40 + 1; bool exists = (find(begin(rivi), end(rivi), pallo) != end(rivi)); if (exists == false) { rivi[i] = pallo; }else i = i - 1; } sort(rivi, rivi + 7); for (int i = 0; i < 7; i++){ arvottuRivi[i] = rivi[i]; } }

C++ C++;rand()在第一次运行时返回无意义的值,在第二次运行时工作正常 我正在做一个抽奖计划,这是我的随机化函数 #include <iostream> #include <stdlib.h> #include <time.h>// for seeding srand #include <algorithm> //for std::find #include <iterator> //for std::begin, std::end using namespace std; void rivinArvonta(int arvottuRivi[]){ int rivi[7]; int pallo = 41; srand(time(NULL)); for (int i = 0; i < 7; i++) { pallo = rand() % 40 + 1; bool exists = (find(begin(rivi), end(rivi), pallo) != end(rivi)); if (exists == false) { rivi[i] = pallo; }else i = i - 1; } sort(rivi, rivi + 7); for (int i = 0; i < 7; i++){ arvottuRivi[i] = rivi[i]; } },c++,random,C++,Random,第二次调用该函数时,它的工作方式与预期的一样 我不明白如何pallo=rand()%40+1可以返回超出范围的内容吗?这可能是因为我使用了g++ PS很抱歉我的变量名是芬兰语。rivi是第一轮未初始化的数据,因此您会收到Adrian mole建议的垃圾。第二次调用将在第一次调用初始化后在同一内存位置使用相同的数组,这就是为什么会得到合理的结果。也不要因为有幸会说其他语言而道歉闻起来有点像未定义的行为:使用一个初始化的局部变量( Riviu)。它是C或C++,所以请删除其中一个标签。然后rivi数

第二次调用该函数时,它的工作方式与预期的一样

我不明白如何
pallo=rand()%40+1可以返回超出范围的内容吗?这可能是因为我使用了g++


PS很抱歉我的变量名是芬兰语。

rivi
是第一轮未初始化的数据,因此您会收到Adrian mole建议的垃圾。第二次调用将在第一次调用初始化后在同一内存位置使用相同的数组,这就是为什么会得到合理的结果。也不要因为有幸会说其他语言而道歉

闻起来有点像未定义的行为:使用一个初始化的局部变量(<代码> Riviu)。它是C或C++,所以请删除其中一个标签。然后rivi数组没有初始化,所以包含像-1648这样的垃圾。。。价值观,而且最有可能的是,由于这一点,该发现无法正常工作……这是否回答了您的问题?您还应该为每个程序调用一次
srand
,而不是为每个函数调用一次call@Sumit代码具有未定义的行为。可能不可能重现OP正在变得容易的具体输出。第二次调用将在相同的内存位置使用相同的数组-不一定,因为它是这样的!您需要添加
static
关键字,以确保在对函数的不同调用中保持值。我知道这一点,但这是我第二轮正确结果的唯一想法-我假设他是背对背调用函数。@user12962917即使如此,这也是纯粹的巧合。@J.Doe这不是纯粹的巧合。语言标准没有提到对同一函数的连续调用中局部变量之间的重叠,但它们很可能被分配到相同的内存位置,并且第二次调用的内容将与第一次调用中最后存储的值相匹配。初始值是垃圾,但对于典型的实现,它可能是可预测的垃圾。当然,这不是你应该依赖的东西;相反,这是一个很难找到的潜在漏洞来源。@J.Doe您最初的评论模棱两可,从英语口语的内涵来看,它似乎是在否定我最初的陈述。基思这样说是正确的
 5, 0, -164820691, 21983, 0, 0, -164820768