#include <iostream>
#include <random>
#include <string>
#include <vector>
#include <cstdint>
#include <chrono>
#include <algorithm>
typedef std::vector<std::string> SVec;
SVec MakeSVec(std::size_t V, std::size_t H) {
std::string Sfen = "KRBGANLPkrbgsnlp123456789wb+- ";//字数あってるかな??
std::random_device rd;
//std::mt19937 mt(rd());//if you need perfect random to delte comment out in top of this line.
std::mt19937 mt(0);
std::uniform_int_distribution<std::size_t> SF(0, Sfen.size()-1);//sfen表現の予定
std::uniform_int_distribution<std::size_t> BF(H-32, H+32);//盤面表現の予定
std::uniform_int_distribution<> PV(-1000000, 1000000);//数字は適当。
std::uniform_int_distribution<std::size_t> PN(16, 256);//パラメータ数の予定
std::string S;
SVec R(V);
std::size_t SN = 0;
for (auto& o : R) {
S.clear();
SN = BF(mt);
S += "'";
for (std::size_t i = 0; i < SN; i++) {
S += Sfen[SF(mt)];
}
S += "'";
SN = PN(mt);
for (std::size_t i = 0; i < SN; i++) {
S += ',' + std::to_string(PV(mt));
}
o = S;
}
std::sort(S.begin(), S.end());
return R;
}
bool Shuffle(SVec& S) {
std::random_device rd;
std::mt19937 mt(rd());//if you need perfect random to delte comment out in top of this line.
//std::mt19937 mt(0);
std::shuffle(S.begin(), S.end(),mt);
return true;
}
int main() {
std::size_t H = 1000000;
std::size_t V = 80;
SVec R;
std::cout << "start data generation.";
auto S = std::chrono::high_resolution_clock::now();
R = MakeSVec(H, V);
auto E = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - S);
std::cout << "..Done. time:"<<E.count()<<"ms."<<std::endl;
std::cout << "start data Shuffle.";
S = std::chrono::high_resolution_clock::now();
Shuffle(R);
E = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - S);
std::cout << "..Done. time:"<<E.count()<<"ms."<<std::endl;
std::cout << "Thank you!" << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFNWZWM7CgpTVmVjIE1ha2VTVmVjKHN0ZDo6c2l6ZV90IFYsIHN0ZDo6c2l6ZV90IEgpIHsKCXN0ZDo6c3RyaW5nIFNmZW4gPSAiS1JCR0FOTFBrcmJnc25scDEyMzQ1Njc4OXdiKy0gIjsvL+Wtl+aVsOOBguOBo+OBpuOCi+OBi+OBqu+8n++8nwoKCXN0ZDo6cmFuZG9tX2RldmljZSByZDsKCS8vc3RkOjptdDE5OTM3IG10KHJkKCkpOy8vaWYgeW91IG5lZWQgcGVyZmVjdCByYW5kb20gdG8gZGVsdGUgY29tbWVudCBvdXQgaW4gdG9wIG9mIHRoaXMgbGluZS4gCglzdGQ6Om10MTk5MzcgbXQoMCk7CglzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxzdGQ6OnNpemVfdD4gU0YoMCwgU2Zlbi5zaXplKCktMSk7Ly9zZmVu6KGo54++44Gu5LqI5a6aCglzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxzdGQ6OnNpemVfdD4gQkYoSC0zMiwgSCszMik7Ly/nm6TpnaLooajnj77jga7kuojlrpoKCXN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gUFYoLTEwMDAwMDAsIDEwMDAwMDApOy8v5pWw5a2X44Gv6YGp5b2T44CCCglzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxzdGQ6OnNpemVfdD4gUE4oMTYsIDI1Nik7Ly/jg5Hjg6njg6Hjg7zjgr/mlbDjga7kuojlrpoKCQoJc3RkOjpzdHJpbmcgUzsKCVNWZWMgUihWKTsKCglzdGQ6OnNpemVfdCBTTiA9IDA7CgoJZm9yIChhdXRvJiBvIDogUikgewoJCVMuY2xlYXIoKTsKCQlTTiA9IEJGKG10KTsKCQlTICs9ICInIjsKCQlmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgU047IGkrKykgewoJCQlTICs9IFNmZW5bU0YobXQpXTsKCQl9CgkJUyArPSAiJyI7CgkJU04gPSBQTihtdCk7CgkJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IFNOOyBpKyspIHsKCQkJUyArPSAnLCcgKyBzdGQ6OnRvX3N0cmluZyhQVihtdCkpOwoJCX0KCQlvID0gUzsKCX0KCglzdGQ6OnNvcnQoUy5iZWdpbigpLCBTLmVuZCgpKTsKCglyZXR1cm4gUjsKCn0KCmJvb2wgU2h1ZmZsZShTVmVjJiBTKSB7CglzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CglzdGQ6Om10MTk5MzcgbXQocmQoKSk7Ly9pZiB5b3UgbmVlZCBwZXJmZWN0IHJhbmRvbSB0byBkZWx0ZSBjb21tZW50IG91dCBpbiB0b3Agb2YgdGhpcyBsaW5lLiAKCS8vc3RkOjptdDE5OTM3IG10KDApOwoKCXN0ZDo6c2h1ZmZsZShTLmJlZ2luKCksIFMuZW5kKCksbXQpOwoKCXJldHVybiB0cnVlOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6c2l6ZV90IEggPSAxMDAwMDAwOwoJc3RkOjpzaXplX3QgViA9IDgwOwoJU1ZlYyBSOwoKCXN0ZDo6Y291dCA8PCAic3RhcnQgZGF0YSBnZW5lcmF0aW9uLiI7CglhdXRvIFMgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCglSID0gTWFrZVNWZWMoSCwgVik7CgoJYXV0byBFID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkgLSBTKTsKCglzdGQ6OmNvdXQgPDwgIi4uRG9uZS4gdGltZToiPDxFLmNvdW50KCk8PCJtcy4iPDxzdGQ6OmVuZGw7CgoJc3RkOjpjb3V0IDw8ICJzdGFydCBkYXRhIFNodWZmbGUuIjsKCVMgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCVNodWZmbGUoUik7CglFID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkgLSBTKTsKCXN0ZDo6Y291dCA8PCAiLi5Eb25lLiB0aW1lOiI8PEUuY291bnQoKTw8Im1zLiI8PHN0ZDo6ZW5kbDsKCglzdGQ6OmNvdXQgPDwgIlRoYW5rIHlvdSEiIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9