#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
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<Item> create_random_items(int m, int n) {
std::vector<Item> chosen_items;
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); */
}
}
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);
}
return chosen_items;
}
int main() {
// Seed random number generator with the current time.
std::srand(std::time(0));
std::vector<Item> items = create_random_items(5, 4);
for (std::vector<Item>::iterator i = items.begin(); i != items.end(); ++i) {
std::cout << '(' << i->x << ',' << i-> y << ')' << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgoKY2xhc3MgSXRlbSB7CnB1YmxpYzoKICAgIEl0ZW0oKTsKICAgIEl0ZW0oaW50IHgsIGludCB5KTsKCiAgICBpbnQgeCwgeTsKfTsKCkl0ZW06Okl0ZW0oKSA6IHgoMCksIHkoMCkgeyB9CgpJdGVtOjpJdGVtKGludCB4LCBpbnQgeSkgOiB4KHgpLCB5KHkpIHsgfQoKc3RkOjp2ZWN0b3I8SXRlbT4gY3JlYXRlX3JhbmRvbV9pdGVtcyhpbnQgbSwgaW50IG4pIHsKCXN0ZDo6dmVjdG9yPEl0ZW0+IGNob3Nlbl9pdGVtczsKCQoJc3RkOjp2ZWN0b3I8SXRlbT4gaXRlbXM7CgoJZm9yIChpbnQgeCA9IDE7IHggPD0gbTsgKyt4KSB7CgkgICAgZm9yIChpbnQgeSA9IDE7IHkgPD0gbTsgKyt5KSB7CgkgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhJdGVtKHgsIHkpKTsKCSAgICAgICAgLyogSWYgeW91IGhhdmUgQysrMTEsIHRoaXMgd2lsbCBiZSBmYXN0ZXI6IGl0ZW1zLmVtcGxhY2VfYmFjayh4LCB5KTsgKi8KCSAgICB9Cgl9CgoJd2hpbGUgKG4tLSkgewoJICAgIC8vIEdldCBhIHJhbmRvbSBudW1iZXIgYW5kIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBpdGVtcwoJICAgIC8vIHZlY3Rvci4gTm90ZSB0aGF0IHRoZSBtb2R1bHVzIHRlY2huaXF1ZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUKCSAgICAvLyBkaXN0cmlidXRpb24gb2YgcmFuZG9tIG51bWJlcnMgd2lsbCBiZSB1bmlmb3JtLgoJICAgIGludCBvZmZzZXQgPSBzdGQ6OnJhbmQoKSAlIGl0ZW1zLnNpemUoKTsKCQoJICAgIC8vIEdldCBhbiBpdGVyYXRvciB0byB0aGlzIGl0ZW0uCgkgICAgc3RkOjp2ZWN0b3I8SXRlbT46Oml0ZXJhdG9yIGl0ZW0gPSBpdGVtcy5iZWdpbigpICsgb2Zmc2V0OwoJCgkgICAgLy8gTW92ZSB0aGUgaXRlbSB0byB0aGUgY2hvc2VuX2l0ZW1zIGxpc3QuCgkgICAgY2hvc2VuX2l0ZW1zLnB1c2hfYmFjaygqaXRlbSk7CgkgICAgCgkgICAgLy8gQysrMTE6IGNob3Nlbl9pdGVtcy5lbXBsYWNlX2JhY2soKml0ZW0pOwoJCgkgICAgLy8gUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIG90aGVyIGxpc3Qgc28gd2UgZG9uJ3QgcGljayBpdCBhZ2Fpbi4KCSAgICBpdGVtcy5lcmFzZShpdGVtKTsKCX0KCglyZXR1cm4gY2hvc2VuX2l0ZW1zOwp9CgppbnQgbWFpbigpIHsKCS8vIFNlZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCB0aGUgY3VycmVudCB0aW1lLgoJc3RkOjpzcmFuZChzdGQ6OnRpbWUoMCkpOwoJCglzdGQ6OnZlY3RvcjxJdGVtPiBpdGVtcyA9IGNyZWF0ZV9yYW5kb21faXRlbXMoNSwgNCk7CgkKCWZvciAoc3RkOjp2ZWN0b3I8SXRlbT46Oml0ZXJhdG9yIGkgPSBpdGVtcy5iZWdpbigpOyBpICE9IGl0ZW1zLmVuZCgpOyArK2kpIHsKCQlzdGQ6OmNvdXQgPDwgJygnIDw8IGktPnggPDwgJywnIDw8IGktPiB5IDw8ICcpJyA8PCBzdGQ6OmVuZGw7Cgl9CgkKCXJldHVybiAwOwp9