我是C ++的新手,我遇到了数组操作的问题。我有一个长度为100的X数组,我需要随机填充整数值为1到10(1,2,3,4,5,6,7,8,9,10)的X值。 我知道会有重复,也许就像打印十次一样,等等,但这真的是我想要的。
这就是我所拥有的:
X的数组:
int X[100];
这是我的代码段:
int* X = NULL;
int* val = NULL;
int length1= 100;
int length2= 10;
X = new int[length1];
val = new int[length2];
int i;
int j;
for (i = 0; i < isi; i++) {
val[i] = i;
for (j = 0; j < length1; j++) {
if (j > i) {
X[j] = val[i];
} else {
X[j] = val[0];
}
cout << "X[" << j << "] = " << X[j] << "\n";
Sleep(1);
}
}
上面的代码使得从索引0到99的数组X的值为0,然后索引0到99的值为1,所以另一个索引直到索引0到99的值为9.
这不是我想要的,我想要的是它(如果它不是随机的)索引0到9的值是0,那么10到19的值是1 ......直到索引90到99有希望我的解释清楚。
我在stackoverflow中遇到了一个问题:How would you make an array of 10000 with only values of 1-1000 inclusive?
但仍然无法解决我的问题。 有人可以给我解决方案。
提前谢谢
答案 0 :(得分:8)
#include <stdlib.h>
int main(int argc, char **argv) {
int r[100];
for (int i = 0; i < 100; ++i) {
r[i] = rand() % 10 + 1;
}
}
对于某些输出,您可以在每次分配后在循环内#include <iostream>
然后std::cout << "r[" << i << "] = " << r[i] << "\n"
。
如果您希望每次为不同的序列播种随机数生成器,请在第一次调用#include <time.h>
之前srand(time(NULL))
然后再rand
。
答案 1 :(得分:7)
您还可以使用generate
功能:
#include <iostream>
#include <algorithm>
#include <random>
using namespace std;
int main()
{
int arr[100];
random_device rd;
default_random_engine dre(rd());
uniform_int_distribution<int> uid(0,9);
generate(arr, arr + sizeof(arr) / sizeof(int), [&] () { return uid(dre); });
for (int a : arr)
cout << a << " ";
}
答案 2 :(得分:4)
以下是解决此问题的两种方法 - 因为这是一种学习体验,所以只提供伪代码(和相关链接)。每个&#34;任务&#34;可以单独查找和解决。请注意,这两种方法都不使用辅助数组。
如果最终结果中每个数字的数量不需要相同(例如,2可能出现17次),那么请考虑以下循环和分配随机方法。每个循环的标准C就足够了。
# for every index pick a random value in [0, 10) and assign it
for i in 0 to last array index:
array[i] = random in range 0, 10
如果需要的数量相同,那么请考虑填充数组,然后将其洗牌。 modulus operator在这里非常方便。 (这假设数组长度是组大小的倍数。)
# fill up array as 0,1,2,3,4,5,6,7,8,9,0,1,2.. (will be 10 groups)
for i in 0 to last array index:
array[i] = i % 10
# and randomly rearrange order
shuffle array
对于shuffle,请参阅Fisher-Yates,它甚至显示了C实现 - 有"more C++" ways,但这是学习和练习循环的好方法。 (关于Fisher-Yates的一个很酷的属性是,一旦项目被交换到当前索引,它就在最终的交换位置 - 因此可以修改随机循环以随机和立即执行一个动作显示值。)
在这两种情况下都应使用random function;否则数字不会是......随机。
答案 3 :(得分:0)
要遍历集合的项目,最自然的C ++循环是基于循环的范围。
为了给每个项目分配一些东西,正式项目名称应该是一个参考,因此:
for( auto& item : X )
{
// E.g. assign to item here.
}
按顺序将数组的每个项目提供给由注释标记的代码。
C ++中有两个不同的随机生成器,旧的C库一个,它只是一对函数,而且更通用,更现代但也不那么容易理解C ++ 11的东西。我建议你谷歌并尝试一下。如果/何时卡住,请询问新的更具体的问题。
答案 4 :(得分:0)
我认为其他人已经指出了,但你必须首先编写预编译器指令#include <ctime>
,然后使用srand函数。大多数人会说不要使用它,但由于你和我在基础知识上,我们的老师分别开始使用它。它也可能适用于您的编译器。
这是一个链接,可以了解更多相关信息。我会评论,但我不能。
http://www.cplusplus.com/reference/cstdlib/srand/