如何避免在 rand() 函数生成的矩阵中使用相同的成员?

Posted

技术标签:

【中文标题】如何避免在 rand() 函数生成的矩阵中使用相同的成员?【英文标题】:How to avoid using same members in a matrix which is made by rand() function? 【发布时间】:2019-04-14 07:28:18 【问题描述】:

我正在尝试制作一个充满随机字母的 5x10 矩阵,一旦使用了该字母,就不应再使用它。其中25个必须是小写字母,25个应该是大写字母。偶数列也应该是小写字母。我不知道如何避免使用相同的字母。我试图将使用过的字母发送到另一个由一维组成的数组,然后检查它发送的每个字母,这样就不会使用相同的字母,但我的编码技能不允许我这样做。 所以,到目前为止我的代码是这样的:

#include <iostream> 
#include <iomanip> 
#include <stdlib.h>
#include <ctime>                
#include <locale.h>             


using namespace std;

const int row = 5;
const int column = 10;

int main()  

    char matris[row][column];

    srand(time(0));

    for (int i = 0; i < row; i++)
        for (int j = 0; j < column; j++)
            if(j % 2 == 0)
                matris[i][j] = rand() % 25 + 65;
            else
                matris[i][j] = rand() % 25 + 97;
    for (int i = 0; i < row; i++)
    
        for (int j = 0; j < column; j++)
            cout << setw(5) << matris[i][j];
        cout << endl;
    
    system("pause");

    return 0;
    

那么,我怎样才能避免使用相同的字母呢?我走错了吗?有没有更简单的方法来做我想做的事情?谢谢...

【问题讨论】:

您的问题必须更加精确,因为“不起作用”并不是一个充分的描述。但是,您需要使用调试器逐步执行代码的实际技能。您可以单步执行它并检查变量的当前状态,因此在每一步之后您都可以验证状态是否与您预期的一样,这将很快发现错误。 创建一个包含所有可能字母的静态数组。如果您对它们中的每一个必须在哪里有一些特殊要求,您可以将它分成小部分和大部分。然后对数组应用一个随机排列(或者如果你拆分它,则两者都应用),你有随机排序的字母,你可以用它来简单地填充你的矩阵。 这可能很有趣:How to Generate a Sequence of Unique Random Integers 澄清一下,偶数列(即 2、4、6... 应该很小)和奇数列(1、3、5...)应该很大?假设基于 1 的索引。 是的。这就是我使用 if 声明的原因。 【参考方案1】:

您需要跟踪已经出现的字符,为此您可以使用 std::set ,在每次随机调用时,检查随机结果是否在集合内:如果是您只是随机另一个编号并重试;如果没有,则将其插入并将其放入矩阵中。

我会使用集合而不是向量,因为它在检查值是否已出现在其中时更快。

查看此内容以了解如何检查集合是否包含元素: How to check that an element is in a std::set?

【讨论】:

在这种情况下这是一个不必要的并发症。尽管如此,即使你要走这条路,你总共只有 52 个字母,你可以创建一个布尔数组并将你已经看到的字母的值设置为 1。这样就不需要进行搜索。至于setvectorset 会更快(渐近,它可能不会在这种大小如此小的特殊情况下),因为它已排序。 你是完全正确的,有更好的方法来“跟踪已经出现的字符”,我给出了一个解决方案 - 恕我直言 - 实施简单,但绝对不是最优的。跨度> 【参考方案2】:

一种可能的解决方案是创建一个包含您要使用的所有符号的向量,将其随机化,然后从中进行绘制。示例

#include <iostream>
#include <algorithm>
#include <vector>
#include <random>

using namespace std;

struct CharPool

    size_t pos;
    vector<char> m_unused_char;

    CharPool()
        : pos(0)
    
        // add whatever characters you like to the pool
        for (char c = 'a'; c <= 'z'; ++c)
            m_unused_char.push_back(c);
        for (char c = 'A'; c <= 'Z'; ++c)
            m_unused_char.push_back(c);

        std::random_device rd;
        std::mt19937 g(rd());

        // randomize
        shuffle(m_unused_char.begin(), m_unused_char.end(), g);
    

    char next()
    
        // here we should assert that the pool is not depleted
        return m_unused_char[pos++];
    
;

int main()

    CharPool pool;
    for (size_t i = 0; i < 10; ++i)
        cout << pool.next() << ", ";
    cout << "\n";

【讨论】:

以上是关于如何避免在 rand() 函数生成的矩阵中使用相同的成员?的主要内容,如果未能解决你的问题,请参考以下文章

函数RAND啥意思

Matlab之rand(), randn(), randi()函数的使用方法

rand产生随机数怎样控制在1~52内而且不能重复。1~52必须出现一次。谢谢

[原创]Matlab生成随机数

matlab有多少api函数

如何使用 spark.sql 将表列传递给 rand 函数?