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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用范围中的随机值填充数组? (重复没问题。)相关的知识,希望对你有一定的参考价值。

我是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] << "
";
        Sleep(1);
    }
}

上面的代码使得从索引0到99的数组X的值为0,然后索引0到99的值为1,因此另一个索引直到索引0到99的值为9。

这不是我想要的,我想要的是它(如果它不是随机的)索引0到9的值为0,那么10到19的值为1 ......直到索引90到99的值为9希望我的解释清楚。

我在stackoverflow中遇到了一个问题:How would you make an array of 10000 with only values of 1-1000 inclusive?

但仍然无法解决我自己的问题。有人可以给我解决这个问题。

先感谢您

答案

以下是解决此问题的两种方法 - 由于这是一种学习体验,因此仅提供伪代码(和相关链接)。可以单独查找和解决每个“任务”。请注意,这两种方法都不使用辅助数组。

如果最终结果中每个数字的数量不需要相同(例如,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;否则数字不会是......随机的。

另一答案
#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] << " "

如果你想每次为不同的序列播种随机数生成器,那么在你第一次调用#include <time.h>之前srand(time(NULL))然后是rand

另一答案

你也可以使用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 << " "; 
}
另一答案

要遍历集合的项目,最自然的C ++循环是基于循环的范围。

为了给每个项目分配一些东西,正式的项目名称应该是一个参考,因此:

for( auto& item : X )
{
    // E.g. assign to item here.
}

这将按顺序提供数组中的每个项目到由注释标记的代码。

C ++中有两个不同的随机生成器,旧的C库一个,它只是一对函数,而且更通用,更现代但也不那么容易理解C ++ 11的东西。我建议你谷歌并尝试一下。如果/何时卡住,请询问新的更具体的问题。

另一答案

我认为其他人已经指出了,但你必须首先编写预编译器指令#include <ctime>然后使用srand函数。大多数人会说不要使用它,但由于你和我在基础知识上,我们的老师分别开始使用它。它也可能适用于您的编译器。这是一个链接,可以了解更多相关信息。我会评论,但我不能。 http://www.cplusplus.com/reference/cstdlib/srand/

以上是关于如何使用范围中的随机值填充数组? (重复没问题。)的主要内容,如果未能解决你的问题,请参考以下文章

随机数生成器不会使用输入字段中的值生成给定范围内的预期数字[重复]

用随机列表中的 2 个值填充 2D 数组(2048 游戏)

如何在给定范围内创建一个随机打乱数字的 int 数组 [重复]

shell脚本生成[4,9]范围内的随机整数,包含边界值4和9,并将随机数序列存放在一个数组中,脚本实现?

查找和替换数组中的重复项

在指定数字范围内,随机获取n个不重复数字