PDA

View Full Version : ایجاد چند عدد رندوم در بازه خاص



Arashx12
جمعه 16 مرداد 1394, 21:31 عصر
سلام ,

چطور میشه از بین مثلا در بازه [1,20] , 15 عدد رندوم تولید کرد؟ بطوری که هیچکدوم مساوی نباشند؟

ehsan_faal
جمعه 16 مرداد 1394, 21:45 عصر
سلام. سعی کنید داکیومنت های کتابخانه random رو مطالعه کنید.

#include <iostream>
#include <ctime>
#include <random>
#include <vector>
using namespace std;

auto createRandoms(int number,int mIn,int mAx)->vector<int>{
default_random_engine eng(time(0));
uniform_int_distribution<int> rnd(mIn,mAx);
vector<int> result(number);
for(auto& item:result){
item = rnd(eng);
}
return result;
}

auto main()->int{
auto display = [](auto item){
for(auto& term:item){
cout<<term<<endl;
}
};
vector<int> randomNumbers{createRandoms(15,1,20)};
display(randomNumbers);
return 0;
}



نتایج:

19
13
14
10
5
12
5
16
11
9
11
7
10
2
16

ehsan_faal
جمعه 16 مرداد 1394, 23:28 عصر
برای اینکه اعداد تکراری هم نداشته باشیم میشه کلا اینجوری برنامه رو نوشت:

#include <iostream>
#include <ctime>
#include <random>
#include <vector>
#include <algorithm>
using namespace std;

auto createRandoms(int number,int mIn,int mAx)->vector<int>{
random_device rd;
mt19937_64 eng(time(0));
uniform_int_distribution<int> rnd(mIn,mAx);
vector<int> result(number);
generate(result.begin(),result.end(),[&](){
return rnd(eng);
});
return result;
}
auto createRandoms2(int number,int mIn,int mAx)->vector<int>{
vector<int> result;
{
vector<int> tmpVect(mAx-mIn+1,0);
iota(tmpVect.begin(),tmpVect.end(),mIn);
random_shuffle(tmpVect.begin(),tmpVect.end());
move(tmpVect.begin(),tmpVect.begin()+number,back_i nserter(result));
}

return result;
}

auto main()->int{
auto display = [](auto item){
for(auto& term:item){
cout<<term<<" ";
}
cout<<endl;
};
display(createRandoms(15,1,20));
display(createRandoms2(15,1,20));

return 0;
}



نتایج:

11 18 5 3 11 5 4 19 4 2 8 19 3 20 14
13 2 10 3 1 12 8 20 5 16 19 6 15 14 11

Arashx12
جمعه 23 مرداد 1394, 15:54 عصر
ببخشید چطور میشه با هر بار اجرای برنامه اعداد مختلف باشند؟چون هر دفعه که اجرای میکنم همان اعدا قبلی تولید میشوند.
از srand(time(NULL)); استفاده کردم ولی تاثیری نداشت

Arashx12
جمعه 23 مرداد 1394, 16:04 عصر
ببخشید چطور میشه با هر بار اجرای برنامه اعداد مختلف باشند؟چون هر دفعه که اجرای میکنم همان اعدا قبلی تولید میشوند.
از srand(time(NULL)); استفاده کردم ولی تاثیری نداشت

مشکل حل شد :

struct RNG {
int operator() (int n) {
return std::rand() / (1.0 + RAND_MAX) * n;
}
};


کد random_shuffle رو هم بصورت زیر تغییر میدهیم :



random_shuffle(tmpVect.begin(),tmpVect.end(),RNG() );