如何避免在 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。这样就不需要进行搜索。至于set
与vector
,set
会更快(渐近,它可能不会在这种大小如此小的特殊情况下),因为它已排序。
你是完全正确的,有更好的方法来“跟踪已经出现的字符”,我给出了一个解决方案 - 恕我直言 - 实施简单,但绝对不是最优的。跨度>
【参考方案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() 函数生成的矩阵中使用相同的成员?的主要内容,如果未能解决你的问题,请参考以下文章
Matlab之rand(), randn(), randi()函数的使用方法