我正在尝试生成一些乐透号码并返回包含这些数字的数组,但我无法继续;请帮忙
void getLotto(int rad[7]) {
int numbers[7];
for (int i = 0; i < 7; i++) {
numbers[i] = rand() % 35 + 1;
}
for (int j = 0; j < 7; j++) {
int n = rand() % 35 + 1;
if (n == numbers[j]) {
numbers[j] = rand() % 35 + 1;
return;
}
}
}
答案 0 :(得分:2)
无法通过函数返回数组。一个常见的事情是动态分配数组并返回指向其第一个元素的指针。这将适用于您的情况,但会产生调用者管理内存的要求(delete[]
new[]
内存)。这就是为什么C ++为我们提供标准数组类的原因:使用并返回std::vector
。如果您支持C ++ 11,请返回std::array
。
答案 1 :(得分:0)
以下情况可能有所帮助,请使用Fisher–Yates_shuffle:
// Fisher–Yates_shuffle
// http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
std::vector<int> FisherYatesShuffle(std::size_t size, std::size_t max_size, std::mt19937& gen)
{
assert(size < max_size);
std::vector<int> res(size);
for(std::size_t i = 0; i != max_size; ++i) {
std::uniform_int_distribution<> dis(0, i);
std::size_t j = dis(gen);
if (j < res.size()) {
if (i != j) {
res[i] = res[j];
}
res[j] = 1 + i;
}
}
return res;
}
答案 2 :(得分:0)
std::vector
和std::array
优于常规数组,但如果您想使用常规数组,则可以按如下方式修改函数:
// Arguments: renamed the array, added N (# of array elements)
void getLotto(int numbers[], size_t N) {
//int numbers[7]; // commented out local variable
for (int i = 0; i < N; i++) {
numbers[i] = rand() % 35 + 1;
}
for (int j = 0; j < N; j++) {
int n = rand() % 35 + 1;
if (n == numbers[j]) {
numbers[j] = rand() % 35 + 1;
return;
}
}
}
int numbers[]
中的括号表示参数是一个数组,实际传递的是指向数组第一个元素的指针。修改numbers
中的getLotto()
会修改传递给函数的数组。
第二个参数的类型为size_t
,因为它是系统用来表示对象大小(如数组)的无符号整数类型的平台相关别名。
这不是那么安全,因为函数必须相信numbers
实际上有N
元素,但这就是你有一个函数修改常规数组而不是{{{}这样的容器的方法。 1}}。
您可以像这样调用函数:
std::vector
答案 3 :(得分:0)
C ++不允许将整个数组作为参数返回给函数。但是,您可以通过指定不带索引的数组名称来返回指向数组的指针。
如果要从函数返回单维数组,则必须声明一个返回指针的函数,如下例所示:
int * myFunction()
{
.
.
.
}
要记住的第二点是C ++不主张将局部变量的地址返回到函数外部,因此您必须将局部变量定义为静态变量。
现在,考虑以下函数,它将生成10个随机数并使用数组返回它们并按如下方式调用此函数:
#include <iostream>
#include <ctime>
using namespace std;
// function to generate and retrun random numbers.
int * getRandom( )
{
static int r[10];
// set the seed
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}
return r;
}
// main function to call above defined function.
int main ()
{
// a pointer to an int.
int *p;
p = getRandom();
for ( int i = 0; i < 10; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
}
return 0;
}
当上面的代码一起编译并执行时,它产生的结果如下
624723190
1468735695
807113585
976495677
613357504
1377296355
1530315259
1778906708
1820354158
667126415
*(p + 0) : 624723190
*(p + 1) : 1468735695
*(p + 2) : 807113585
*(p + 3) : 976495677
*(p + 4) : 613357504
*(p + 5) : 1377296355
*(p + 6) : 1530315259
*(p + 7) : 1778906708
*(p + 8) : 1820354158
*(p + 9) : 667126415
答案 4 :(得分:0)
有两种主要方法可以实现这一目标。
注意:我不确定你的第二个for循环是做什么的。我想这是为了确保这些数字都是独一无二的?你可能想看看它,因为它不是它正在做的事情。 出于这个问题的目的,我将其剪切为仅生成随机数来填充数组。
第一个是获取代码并修复它以将生成的数字放入传入的数组中:
#include <iostream>
void getLotto(int numbers[7]) {
for (int i = 0; i < 7; i++)
{numbers[i] = rand() % 35 + 1;}
return;
}
int main()
{
srand(time(0));
int lotto_numbers[7];
getLotto(lotto_numbers);
for (int i = 0; i < 7; i++)
{std::cout<<lotto_numbers[i]<<std::endl;}
}
numbers
实际上并未作为int[]
传入,而是作为指向数组的int*
。这意味着您在函数中对其所做的任何更改都会在原始数据中更改
请记住,您需要跟踪数组边界,因为数组可以定义为
int lotto_numbers[6]
这意味着
numbers[7]
会超出范围。
第二种方法是在堆上创建数组。这意味着您不需要传入数组,但可以在函数中实例化它
我实际上并没有在这里提供此代码。主要是因为对于像这样简单的东西,内存管理比它的价值更麻烦。 (你需要记得为堆上创建的所有内容调用delete[]
)。
相反,让我们使用内置内存管理的东西:
#include <iostream>
#include <vector>
std::vector<int> getLotto() {
std::vector<int> numbers;
numbers.reserve(7);
for (int i = 0; i < 7; i++) {
//numbers[i] = rand() % 35 + 1;
//would work, but is unsafe as you could potentially reference somthing out of range
//this is safer:
numbers.push_back(rand() % 35 + 1);
}
return numbers;
}
int main()
{
srand(time(0));
std::vector<int> lotto_numbers = getLotto();
for (auto i = lotto_numbers.begin(); i != lotto_numbers.end(); i++)
{
std::cout<<*i<<std::endl;
}
}
该向量为您处理内存管理。可以返回向量,返回的向量仍将指向刚刚填充的堆上的已分配内存。我们不需要释放它,因为当向量超出范围时,这将自动完成。