从用户输入的范围中为不同的类创建不同的随机x,y值

时间:2014-10-30 03:06:24

标签: c++ c random

我先创建一个课程

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:这似乎找到了不同的观点。坐标在正方形

2 个答案:

答案 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。)