यदि आप पहले srand()
पर कॉल किए बिना rand()
पर कॉल करते हैं, तो यह कार्य करेगा जैसे आपने srand(1)
को स्पष्ट रूप से बुलाया है। मानक C99 7.20.2.2 The srand function
(जिस पर cstdlib
आधारित है) की प्रासंगिक बिट राज्यों:
रैंड से पहले srand के लिए किसी भी कॉल किए गए हैं, उसी क्रम जब srand पहले एक बीज के साथ कहा जाता है के रूप में उत्पन्न हो जाएगा कहा जाता है के 1.
मूल्य दूसरे शब्दों में, आप उसी क्रम हर बार मिल जाएगा। यह मानते हुए कि आप इसे एक बार से अधिक एक दूसरे नहीं चला
int main (int argc, char* argv []) {
srand (time (0)); // needs ctime header.
for (int i = 0; i < 5; i++)
cout << random (2, 5) << endl;
wait();
}
इसे ठीक करने,: आप अपने main
में बदल सकते हैं।
जैसा कि बताया गया है, आपको इसके लिए ctime
शीर्षलेख की आवश्यकता होगी। आपको cstdlib
में भी खींचना चाहिए क्योंकि rand
और srand
लाइव है। उदाहरण के लिए math.h
के बजाय XXX.h
वाले (cmath
) के बजाय cXXX
हेडर का उपयोग करना आमतौर पर एक अच्छा विचार है।
तो, सभी उन परिवर्तनों (और स्पष्ट नामस्थान, जो मैं पसंद का उपयोग कर, हालांकि दूसरों को नहीं कर सकते हैं) बना रहा है, मैं के साथ समाप्त होता है:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
void wait() {
int e;
std::cin >> e;
}
int random (int low, int high) {
if (low > high) return high;
return low + (std::rand() % (high - low + 1));
}
int main (int argc, char* argv []) {
std::srand (std::time (0));
for (int i = 0; i < 5; i++)
std::cout << random (2, 5) << '\n';
wait();
}
जो एक अलग अनुक्रम हर बार देता है मैं वैसे भी, कुछ बार के लिए इसे चलाने के लिए। जाहिर है, डेटा दोहराए जाने पर एक कठोर सीमा है (केवल 4 संभावनाएं हैं) और आउटपुट की "यादृच्छिक" प्रकृति का अर्थ है कि यह पहले भी दोहरा सकता है :-)
नाइट: गणितीय रूप से, उन्हें "अधिक यादृच्छिक" नहीं बनाएगा। –
सच है, लेकिन ओपी के प्रश्न के संदर्भ में ... (प्लस यह उद्धरणों में है ;-) – John3136