【问题标题】:Generating unique random characters and saving them in array [duplicate]生成唯一的随机字符并将它们保存在数组中[重复]
【发布时间】:2017-04-10 17:03:50
【问题描述】:

我想生成随机数并将它们保存在一个数组中。就是这样!但重点是,我想避免重复,并且数组中没有数字两次或多次。

我的代码:

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main()
{
    int k, temp;

    cin >> k;

    int sym[k];

    srand(time(NULL));

    for (int i = 0; i < k; i++)
    {
        temp = rand() % 25 + 97;

        for(int j=0; j<i; j++)
        {
            while(temp == sym[j])
            {
                temp = rand() % 25 + 97; // 25 means a and 122 means z
            }
        }

        sym[i] = temp;

    }

    for(int i=0; i<k; i++)
    {
        cout << sym[i] << endl;
    }
    return 0;
}

我仍然得到重复的结果。

【问题讨论】:

  • 如果 temp == sym[1],您会生成一个新的 temp,但不会与 sym[0] 重新比较。
  • 你可以直接使用az来计算你的常数。
  • k 不是常量表达式时,int sym[k]; 不是标准 C++,应该避免这种情况(最好使用std::vector,如果不可能,new)。

标签: c++ random


【解决方案1】:

我会使用 std::unordered_set 来避免重复

【讨论】:

    【解决方案2】:

    随机生成器并不意味着唯一的生成,冲突总是会发生,尤其是当生成值的数量很大并且生成的界限或限制很小时......

    为了避免重复的元素替换这个数组

    int sym[k];
    

    通过一组不允许重复条目的容器...

    std::set<int>
    

    之后需要替换逻辑,因为循环k次并不意味着集合中有k个元素,所以需要做一个while循环,直到集合的大小达到限制k

    编辑:

    如果您需要一些未排序的生成值,请考虑实现 unordered_set

    ,而不是使用 set

    【讨论】:

    • A set 将对元素进行排序,因此可能不需要。
    • 好吧,他没有指定排序,在这种情况下他需要一个 unordered_set
    • 在不使用 set 或 vector 的情况下有没有办法做到这一点?因为我是 C++ 新手,现在还不知道这些东西。
    • 循环插入数组,生成一个数字,但在将其插入数组之前验证值不存在......太多工作......
    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多