একটি আরও ভাল র্যান্ডম নম্বর জেনারেটর পিসিজি বাস্তবায়নের চেয়ে পিসি.এস.ইসের জন্য আর কী সমস্যা ? এই নতুন কাগজটি দ্রুত, কঠোর-পূর্বাভাস, ছোট, পরিসংখ্যানগতভাবে অনুকূল এলোমেলো সংখ্যা জেনারেটর উপস্থাপন করার দাবি করেছে।
এর সর্বনিম্ন সি বাস্তবায়ন প্রায় নয়টি লাইন:
// *Really* minimal PCG32 code / (c) 2014 M.E. O'Neill / pcg-random.org
// Licensed under Apache License 2.0 (NO WARRANTY, etc. see website)
typedef struct { uint64_t state; uint64_t inc; } pcg32_random_t;
uint32_t pcg32_random_r(pcg32_random_t* rng)
{
uint64_t oldstate = rng->state;
// Advance internal state
rng->state = oldstate * 6364136223846793005ULL + (rng->inc|1);
// Calculate output function (XSH RR), uses old state for max ILP
uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u;
uint32_t rot = oldstate >> 59u;
return (xorshifted >> rot) | (xorshifted << ((-rot) & 31));
}
(থেকে: http://www.pcg-random.org/download.html )
প্রশ্নটি: আপনি আরও ভাল করতে পারেন?
বিধি
একটি প্রোগ্রাম লিখুন বা একটি ফাংশন সংজ্ঞায়িত করুন যা 32-বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যায় পিসিজি প্রয়োগ করে। এটি মোটামুটি বিস্তৃত: আপনি একটি অসীম অনুক্রম প্রিন্ট করতে পারেন, কোনও pcg32_random_r
ফাংশন এবং সংশ্লিষ্ট কাঠামো সংজ্ঞায়িত করতে পারেন etc.
আপনাকে অবশ্যই নীচের সি ফাংশনের সমানভাবে আপনার এলোমেলো নম্বর জেনারেটর বীজ করতে সক্ষম হতে হবে:
// pcg32_srandom(initstate, initseq)
// pcg32_srandom_r(rng, initstate, initseq):
// Seed the rng. Specified in two parts, state initializer and a
// sequence selection constant (a.k.a. stream id)
void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initstate, uint64_t initseq)
{
rng->state = 0U;
rng->inc = (initseq << 1u) | 1u;
pcg32_random_r(rng);
rng->state += initstate;
pcg32_random_r(rng);
}
(থেকে pcg_basic.c:37
:)
প্রথমে বীজ ছাড়াই এলোমেলো নম্বর জেনারেটরকে কল করা অপরিজ্ঞাত আচরণ।
আপনার জমাটি সহজেই পরীক্ষা করতে, যাচাই করে নিন, যখন বীজযুক্ত হয় initstate = 42
এবং initseq = 52
আউটপুটটি 2380307335
:
$ tail -n 8 pcg.c
int main()
{
pcg32_random_t pcg;
pcg32_srandom_r(&pcg, 42u, 52u);
printf("%u\n", pcg32_random_r(&pcg));
return 0;
}
$ gcc pcg.c
$ ./a.out
2380307335
স্কোরিং
স্ট্যান্ডার্ড স্কোরিং। বাইটে পরিমাপ করা হয়। সর্বনিম্ন সেরা। টাই ক্ষেত্রে, পূর্বে জমা জিতেছে। স্ট্যান্ডার্ড লুফোলস প্রযোজ্য।
নমুনা সমাধান
gcc -W -Wall
পরিষ্কারভাবে সংকলন (সংস্করণ 4.8.2)।
আপনি একই ক্রমটি পেয়েছেন তা নিশ্চিত করতে আপনার জমা দেওয়ার সাথে এটির তুলনা করুন।
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
typedef struct { uint64_t state; uint64_t inc; } pcg32_random_t;
uint32_t pcg32_random_r(pcg32_random_t* rng)
{
uint64_t oldstate = rng->state;
// Advance internal state
rng->state = oldstate * 6364136223846793005ULL + (rng->inc|1);
// Calculate output function (XSH RR), uses old state for max ILP
uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u;
uint32_t rot = oldstate >> 59u;
return (xorshifted >> rot) | (xorshifted << ((-rot) & 31));
}
void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initstate, uint64_t initseq)
{
rng->state = 0U;
rng->inc = (initseq << 1u) | 1u;
pcg32_random_r(rng);
rng->state += initstate;
pcg32_random_r(rng);
}
int main()
{
size_t i;
pcg32_random_t pcg;
pcg32_srandom_r(&pcg, 42u, 52u);
for (i = 0; i < 16; i++)
{
printf("%u\n", pcg32_random_r(&pcg));
}
return 0;
}
ক্রম:
2380307335
948027835
187788573
3952545547
2315139320
3279422313
2401519167
2248674523
3148099331
3383824018
2720691756
2668542805
2457340157
3945009091
1614694131
4292140870