সি
প্রস্থের পতাকাটি (বা আপনার সংকলক যেটি ব্যবহার করে) দিয়ে সংকলন করুন।
#include <stdio.h>
#include <pthread.h>
#define m (unsigned long)2147483647
#define q (unsigned long)127773
#define a (unsigned int)16807
#define r (unsigned int)2836
static unsigned long seed;
pthread_t t[20];
int lo, hi, done;
void *pseudorandom(void *id)
{
while(done)
{
int test;
hi = seed/q;
lo = seed%q;
test = a * lo - r * hi;
if (test > 0) seed = test;
else seed = test + m;
}
}
main()
{
int i;
seed = 54321;
done = 1;
for(i = 0; i < 20; i++)
{
pthread_create(&(t[i]), NULL, &pseudorandom, NULL);
}
for (i = 0; i < 10; i++)
{
printf("%lu\n", seed);
}
done = 0;
}
আমি নিশ্চিত নই যে এটি "সময় অনুমোদিত নয়" মানের ভিত্তিতে যোগ্যতা অর্জন করবে বা না করুক, কারণ এটি মূলত সূচিপত্রটি ইচ্ছাকৃতভাবে থ্রেড সুরক্ষা উপেক্ষা করে এন্ট্রপির উত্স হিসাবে ব্যবহার করছে। এটি একটি হার্ড কোডেড প্রাথমিক বীজের সাথে মোটামুটি বেসিক সোয়েডো-র্যান্ডম ফাংশন ( লেহমার এলোমেলো নম্বর জেনারেটর ) ব্যবহার করে কাজ করে । এরপরে এটি 20 টি থ্রেড শুরু করে যা সমস্ত লেয়ারের গণনাটি ভেরিয়েবলের একটি ভাগ করে সেট করে।
মোটামুটি ভালভাবে কাজ করার জন্য মনে হচ্ছে, এখানে একটানা কয়েকটা রান রয়েছে:
comintern ~ $ ./a.out
821551271
198866223
670412515
4292256
561301260
1256197345
959764614
874838892
1375885882
1788849800
comintern ~ $ ./a.out
2067099631
953349057
1736873858
267798474
941322622
564797842
157852857
1263164394
399068484
2077423336
সম্পাদনা:
এটিকে আরও একটু চিন্তাভাবনা করেছেন এবং বুঝতে পেরেছেন যে এটি সময়ভিত্তিক নয়। এমনকি পুরোপুরি ডিটারমিনিস্টিক শিডিয়ুলার সহ, এনট্রপিটি সময় স্লাইস থেকে আসে না - এটি সিস্টেমে চলমান সমস্ত প্রক্রিয়া লোড করে আসে।
সম্পাদনা 2
@ কুইকুনস থেকে একটি বেল বক্ররেখা পোস্ট করার পরে কিছুটা অনুপ্রেরণা নেওয়ার পরে, আমি 12MB এলোমেলো একটি ফাইলের মধ্যে ফেলে দিলাম এবং এটি ক্যাসারেটে আপলোড করেছি । এটি সমস্ত ডেইহার্ড পরীক্ষায় ব্যর্থ হয়েছিল, তবে ইএনটি পরীক্ষায় 8 টির মধ্যে একটি শ্রদ্ধেয় 7.999573 এ আটকিয়েছে (কেবলমাত্র সম্ভাব্য প্রতিরোধক )। কৌতূহলজনকভাবে, থ্রেডের গণনা দ্বিগুণ করা এটি আরও খারাপ করেছে।