تولید اعداد تصادفی منحصر بفرد - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تولید اعداد تصادفی منحصر بفرد

0 امتیاز
سلام خدمت دوستان عزیز.

نظرات دوستان با تجربه را می خواستم .فرض کنید قراره کلاسی طراحی کنیم  این کلاس باید وقتی متد get را صدا می زنیم یک عدد تصادفی برگردونه شرط مورد نظر اینه که تو سازنده در ابتدا مشخص می کنیم که حتما به فرض مثال نسبت به ۱۰۰۰ تای قبلیش باید یونیک باشه  .اعداد تصادفی هم باید تو هر رنجی که بخایم تولید بشه .شما باشین چطور همچین چیزی را پیاده می کنید؟
سوال شده شهریور 1, 1399  بوسیله ی Mad (امتیاز 245)   10 35 47
سلام؛ این پیاده‌سازی رو بررسی کنید ببینید به دردتون می‌خوره یا نه :
https://gist.github.com/mg-ramezani/4854511b2557c8cbd4b82faf672ec74c
ممنون.نه این کد فقط یک سری عدد تصادفی برمی گردونه.چون اعداد تصادفی هر چقدر رنج کوچک باشه تعداد تصادفی های با هم برابر میشه .من باید از یک لیست حلقوی استفاده کنیم که از یک طرف کاربر pop کنه از طرف دیگه بهش یونیک push بشه .باید تضمین کنه که عددی فعلی به طور مثال با ۱۰۰۰ تای قبل تداخلی نداره.
خواهش می‌کنم دقیق‌تر بررسی کنید، من از یک std::set استفاده کرده‌ام برای ذخیره سازی اعداد تصادفی تولید شده توسط STL Random پس هیچ عدد تکراری داخل این وجود نداره. البته اگه بازهٔ نادرست بدید می‌تونه داخل حلقهٔ بی‌نهایت بی‌افته که باید این رو مدیریت کنید داخل کد.

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

با unordered_set نوشتم توش رنج رو هم گذاشتم بهتر از این هم میشه جنریک بنویسید که نوع داده را هم کاربر خودش مشخص کنه 


class UniqueNumberGenerator {
public:

	UniqueNumberGenerator(int range, int buffer_size) :
		range_(range),
		buffer_size_(buffer_size) {
		srand(time(NULL));
		fillSet();
	}

	std::vector<int> getNumbers(int count) {
		std::vector<int> result;
		result.reserve(count);
		int _count = count;
		if (_count > buffer_size_)
			_count = buffer_size_;

		auto end = buffer_.begin();
		std::advance(end, _count);
		for (auto it = buffer_.begin(); it != end; it++) {
			result.push_back(*it);
		}

		buffer_.erase(buffer_.begin(), end);
		fillSet();
		return result;
	}


private:
	std::unordered_set<int> buffer_;

	int range_;
	int buffer_size_;
	void fillSet() {

		while (buffer_.size() < buffer_size_) {
			int value = rand() % range_;
			buffer_.insert(value);
		}
	}
};

 

پاسخ داده شده شهریور 1, 1399 بوسیله ی toopak (امتیاز 2,458)   16 48 66
انتخاب شد شهریور 1, 1399 بوسیله ی Mad
ممنون واقعا لطف کردید دقیقا همونیه که می خواستم
...