PDA

View Full Version : حرفه ای: تولید اعداد تصادفی غیر تکراری از 0 تا n



UfnCod3r
شنبه 11 آبان 1392, 11:43 صبح
سلام
من ی کد خیلی خوب و سریع می خوام که عدد تصادفی غیر تکراری تولید کنه .
برای جستجوی ی ارایه به صورت تصادفی نیاز دارم .
سرعتش برام مهمه وگرنه با rand() هم میشه .
الگوریتمی چیزی هست؟:متفکر:

mehran6764
شنبه 11 آبان 1392, 11:59 صبح
public class Numbers
{
public ArrayList RandomNumbers(int max)
{
// Create an ArrayList object that will hold the numbers
ArrayList lstNumbers = new ArrayList();
// The Random class will be used to generate numbers
Random rndNumber = new Random();

// Generate a random number between 1 and the Max
int number = rndNumber.Next(1, max + 1);
// Add this first random number to the list
lstNumbers.Add(number);
// Set a count of numbers to 0 to start
int count = 0;

do // Repeatedly...
{
// ... generate a random number between 1 and the Max
number = rndNumber.Next(1, max + 1);

// If the newly generated number in not yet in the list...
if (!lstNumbers.Contains(number))
{
// ... add it
lstNumbers.Add(number);
}

// Increase the count
count++;
} while (count <= 10 * max); // Do that again

// Once the list is built, return it
return lstNumbers;
}
}




من از این استفاده می کنم غیر تکراری تولید می کنه اما فکر می کنم روش های بهتر از این هم باشه

مصطفی ساتکی
شنبه 11 آبان 1392, 13:21 عصر
سلام
من ی کد خیلی خوب و سریع می خوام که عدد تصادفی غیر تکراری تولید کنه .
برای جستجوی ی ارایه به صورت تصادفی نیاز دارم .
سرعتش برام مهمه وگرنه با rand() هم میشه .
الگوریتمی چیزی هست؟:متفکر:

یه راه سریع که وجود داره از تابع random_shuffle خود std استفاده کنی که در واقع همون روش knuthShuffle هستش.

#include <algorithm>
#include <vector>

int main()
{
int c_arr[] = { 1,2,3,4,5,6,7,8,9 };
std::vector<int> cpp_vec(c_arr, c_arr+ 9);

std::random_shuffle(c_arr, c_arr+ 9);
std::random_shuffle(cpp_vec.begin(), cpp_vec.end());
}

rahnema1
شنبه 11 آبان 1392, 14:48 عصر
اینجوری هم میشه:



#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int* sample(int n);
int main(){
int n=9;
int* arr1;
arr1=sample(n);
for (int i=0;i<9;i++) printf("%d",arr1[i]);
}
int* sample(int n){
int* arr=(int*)calloc(n,sizeof(int));
for(int i=0;i<n;i++) arr[i]=i;
srand(time(NULL));
int tmp,dex;
while(n>0){
dex=rand() % (n--);
tmp=arr[dex];
arr[dex]=arr[n];
arr[n]=tmp;
}
return arr;
}

UfnCod3r
شنبه 11 آبان 1392, 15:25 عصر
ممنون . من الان اینو نوشتم برای بازه ی کم خوبه . :متفکر: یکمم باید بهینه بشه .:متفکر:

template < int Length> class TNonRepeatIndexGenerator
{
int mSeek;
int mSeed;
int* mPNum2;
int* mPNum1;

int mNum1[Length];
int mNum2[Length];


public:
void Init()
{
srand(time(nullptr));
for (int i = 0; i < Length; i++)
{
mNum1[i] = i;
mNum2[i] = i;
}

mPNum1 = mNum1;
mPNum2 = mNum2;

mSeed = mSeek = 0;
}

void Begin()
{
mSeek = 0;
mSeed = rand() % Length;
std::swap(mPNum1, mPNum2);
}
int Rand()
{
assert(mSeek != Length);
std::swap(mPNum2[mSeek], mPNum2[(mSeek+mSeed)%Length]);
int ret = mPNum1[mSeek];
mSeek++;
return ret;
}
};

TNonRepeatIndexGenerator<8> GGen;

int main(int argc, char** argv)
{
GGen.Init();
for (int i = 0; i < 32; i++)
{
GGen.Begin();
for (int i = 0; i < 8; i++)
std::cout << GGen.Rand() << " ";
std::cout << "\n";
}
std::system("pause");
}

RoboC0der
شنبه 11 آبان 1392, 15:27 عصر
http://stackoverflow.com/questions/1640258/need-a-fast-random-generator-for-c

UfnCod3r
شنبه 11 آبان 1392, 15:44 عصر
درواقع هدفم اینه که با روش تصادفی ی ارایه رو جستجو کنم
واس همین سرعت هم برام مهمه وگرنه میشه از همون rand استفاده کردو اعداد رو هر سری تو یک جا ذخیره کرد تا فهید تکراری هستن یا نه .
پس کدی که هی malloc می کنه و rand ندین .:عصبانی++:

rahnema1
شنبه 11 آبان 1392, 16:23 عصر
خودت هم که همین کار رو کردی بالاخره مشخص نشد چه کار می خواهی بکنی