如何使用范围中的随机值填充数组? (重复没问题。)

时间:2014-09-26 02:23:09

标签: c++ arrays random

我是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?

但仍然无法解决我的问题。 有人可以给我解决方案。

提前谢谢

5 个答案:

答案 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/