我先创建一个课程
class Item
{
private:
int x;
int y;
}
我获得用户输入m(例如,5)和用户输入n(例如,4) 问题是如何从1到5创建不同的(x,y)值并将它们分配给4类Item。 我希望得到像这样的结果 (1,2)(2,2)(3,4)(4,1) - 只要x或y与其他的不同。
我不想得到像这样的结果 (1,2)(1,2)
PS:我知道如何编写公共方法来将值赋给类的属性 我只是想知道如何创造这些价值
PS2:这似乎找到了不同的观点。坐标在正方形
答案 0 :(得分:0)
这个怎么样?
for(int i = 0; i < m && n > 0; i++){
for(int j = 0; j < m && n > 0; j++){
// create Item (i,j) here
n --;
}
}
答案 1 :(得分:0)
你可以采取两种方法:计算所有(i,j)对,其中(1≤i≤m)和(1≤j≤m),然后取n个随机对,或者你可以随机计算配对并检查您是否已创建它们。
我将展示第一个,因为它更容易实现。首先,让我们给Item
类一个合适的构造函数。
class Item {
public:
Item();
Item(int x, int y);
int x, y;
};
Item::Item() : x(0), y(0) { }
Item::Item(int x, int y) : x(x), y(y) { }
现在让我们将所有项目放在std::vector
。
std::vector<Item> items;
for (int x = 1; x <= m; ++x) {
for (int y = 1; y <= m; ++y) {
items.push_back(Item(x, y));
/* If you have C++11, this will be faster: items.emplace_back(x, y); */
}
}
现在让我们选择一个随机n
并将它们放入矢量中。
std::vector<Item> chosen_items;
// Seed random number generator with the current time.
std::srand(std::time(0));
while (n--) {
// Get a random number and make sure that it is within the bounds of the items
// vector. Note that the modulus technique does not guarantee that the
// distribution of random numbers will be uniform.
int offset = std::rand() % items.size();
// Get an iterator to this item.
std::vector<Item>::iterator item = items.begin() + offset;
// Move the item to the chosen_items list.
chosen_items.push_back(*item);
// C++11: chosen_items.emplace_back(*item);
// Remove the item from the other list so we don't pick it again.
items.erase(item);
}
此代码需要以下标题:
#include <vector>
#include <cstdlib>
#include <ctime>
(See a demo。)