একটি (সম্পূর্ণ নিরোধক) সিউডোর্যান্ডম বিট স্ট্রিম তৈরি করুন


11

হাত বেঁধে র্যান্ডম দ্বারা অনুপ্রাণিত :


লক্ষ

এই চ্যালেঞ্জের লক্ষ্য হ'ল একটি প্রোগ্রাম লিখুন যা সিউডোরেন্ডম বিট স্ট্রিম তৈরি করে যা 1s এবং 0 এর স্ট্রিং যা খাঁটি এলোমেলো বলে মনে হয় তবে এটি একটি নির্মাতামূলক উপায়ে উত্পন্ন হয়। আপনার প্রোগ্রামের 1 এবং 0 এর স্ট্রিং আউটপুট করা উচিত (whচ্ছিক সাদা স্থান সহ) এবং নিম্নলিখিত প্রয়োজনীয়তাগুলি পাস করতে হবে:

  1. সীমাহীন সময় এবং মেমরি দেওয়া, আপনার প্রোগ্রাম অবশ্যই 1s এবং 0 এর স্ট্রিং চিরতরে চালিয়ে যেতে হবে
  2. আপনার প্রোগ্রামটি প্রায় এক মিনিটের মধ্যে 1000 টিরও বেশি এলোমেলো বিট যুক্তিসঙ্গত মেশিনে আউটপুট দিতে হবে। যদি এই প্রয়োজনীয়তা অসম্ভব, তবে আমি এটি কমিয়ে দেব।
  3. বিটের স্ট্রিং পুনরাবৃত্তি করতে পারে তবে পুনরাবৃত্তি বিভাগের দৈর্ঘ্য অবশ্যই 1000 বিটের বেশি হওয়া উচিত।
  4. বিটের স্ট্রিং অবশ্যই যথাসম্ভব এলোমেলো পরীক্ষার (নীচে বর্ণিত) পাস করতে হবে।
  5. প্রোগ্রামটি অবশ্যই কোনও বাহ্যিক উত্স থেকে কোনও ইনপুট নেবে না বা কোনও বিল্ট-ইন র্যান্ড () - এর মতো ফাংশন ব্যবহার করবে না।
  6. উপরের প্রয়োজনের কারণে, প্রোগ্রামটি প্রতিবার চালিত হওয়ার সময় বিটগুলির একই সঠিক স্ট্রিং আউটপুট করতে হবে।

র্যান্ডমনেস টেস্ট # 1

সিউডোর্যান্ডম বিটের স্ট্রিংটিতে ভিজ্যুয়াল ইন্সপেকশন করার সময় কোনও সুস্পষ্ট নিদর্শন অন্তর্ভুক্ত করা উচিত নয়।

র্যান্ডমনেস টেস্ট # 2 (মন্তব্যের ভিত্তিতে পরিবর্তনের সাপেক্ষে)

বিটের স্ট্রিংয়ে অবশ্যই 1s এবং 0 এর সমান বন্টন থাকতে হবে। এটি পরীক্ষা করার জন্য (এবং অন্যান্য জিনিসগুলিও), বিটের প্রবাহটি 3 বিট লম্বা অংশগুলিতে বিভক্ত হয় 101|111|001

এই সমস্ত বিভাগের মধ্যে, তাদের মধ্যে ১/৮ এর তিনটি 1s এবং 0s হওয়া উচিত, তাদের মধ্যে 3/8 এর দুটি 1s এবং একটি 0, 3/8 হওয়া উচিত একটি 1 এবং দুটি 0, এবং 1/8 তাদের মধ্যে কোনও 1s এবং তিনটি 0 টি হওয়া উচিত।

র্যান্ডমনেস টেস্ট # 3

একটি "রান" বিটগুলির ক্রমাগত সিরিজ হিসাবে সংজ্ঞায়িত করা হয় যা সবার সমান মান থাকে। স্ট্রিংয়ের 1001001110আকার 1 ( 1..1.....0) এর তিন রান, আকার 2 ( ) এর দুটি রান এবং আকার 3 ( .00.00....) এর একটি রান রয়েছে ......111.। লক্ষ্য করুন যে রানগুলি ওভারল্যাপ হয় না।

১০০০ এলোমেলো বিটের স্ট্রিংয়ের মধ্যে, আকারের প্রায় 250 রান, আকার 2 এর 125 রান, আকার 3 এর 62 রান, ইত্যাদি হওয়া উচিত run র রান সাইজের জন্য 1000/(2**(R+1)), সেই আকারের প্রায় রান থাকতে হবে ।

র্যান্ডমনেস টেস্ট # 4

প্রথম 840 বিটগুলি প্রতিটি 420 বিটের দুটি অংশে বিভক্ত। প্রথমার্ধের প্রতিটি বিট দ্বিতীয় অর্ধের সংশ্লিষ্ট বিটের সাথে তুলনা করা হয়। দুটি বিট সময় পঞ্চাশ শতাংশ মেলা উচিত।


এখানে পার্ল প্রোগ্রামের উত্স কোড যা 2 থেকে 4 পরীক্ষা করে now এখনকার মতো, এটিতে প্রয়োজন যে বিটগুলির স্ট্রিংটিতে কোনও শ্বেত স্থান না থাকে।


উদ্দেশ্য বিজয়ী মানদণ্ড সময়!

বিজয়ী হ'ল এমন প্রোগ্রাম যা requirements টি প্রয়োজনীয়তা এবং সমস্ত এলোমেলোভাবে সমস্ত পরীক্ষার ডিগ্রিতে পাস করে যা এলোমেলো থেকে আলাদা নয়। যদি একাধিক প্রোগ্রাম এটি সম্পাদন করে, তবে যেটির পুনরাবৃত্তি করতে সবচেয়ে বেশি সময় লাগে সে জিতবে। যদি একাধিক প্রোগ্রাম এটি সম্পাদন করে তবে টাই-ব্রেকার হিসাবে কাজ করার জন্য আমাকে আরও র্যান্ডমনেস টেস্টগুলি পেতে হতে পারে।


# 2 এবং # 3 এলোমেলোতার জন্য খুব ভাল মানদণ্ড নয়। বিশেষত # 2 এর জন্য, একটি এলোমেলো নমুনা সম্ভবত এই বৈশিষ্ট্যটি প্রদর্শন করবে না। সম্ভবত আপনি আরও বড় নমুনা আকার করতে পারেন? আমি 100 এবং 300 এর মধ্যে কিছু প্রস্তাব দেব
জোয়েল করনেট

বিটস্ট্রিমের বৃহত উইন্ডোটির গড়টি খুব বেশি পরিবর্তন ঘটবে না (এবং এটি 0.5 এর কাছাকাছি হওয়া উচিত)
জোয়েল করনেট

@ জোয়েল কর্নেট পরামর্শের জন্য ধন্যবাদ। এলোমেলো পরীক্ষা সম্পর্কে আমি বেশি কিছু জানি না। আমি # 2 অন্য কিছুতে পরিবর্তন করব এবং আমি গড়ের গড়পড়তা সম্পর্কে পড়ছি।
PhiNotPi

1
সমস্যা নেই. এলোমেলো ক্রমগুলি ঝাঁকুনি এবং একত্রে বিতরণ করা হয় না, এটি এমন একটি সত্য যা কখনও কখনও জালিয়াতি সনাক্ত করতে অ্যাকাউন্টিংয়ে ব্যবহৃত হয়। (জালিয়াতি সংখ্যাগুলি প্রায়শই সমানভাবে বিতরণ করা হবে, কারণ লোকেরা এলোমেলোতার জন্য একত্রীকরণের ভুল আবিষ্কার করে)
জোয়েল করনেট

আমি কি ক্রিপ্টো ফাংশনে অন্তর্নির্মিত ব্যবহার করতে পারি (যেমন AES বা SHA-2)?
কোডসইনচওস

উত্তর:


8

সি, 61

main(s,n){for(n=1u<<31;putchar((s%=n)/(n/2)&1|48);s*=65539);}

হ্যাঁ, আমি জানি এটি কোড গল্ফ নয়। এটি স্পষ্টতই একটি বিরোধী সমাধান ... তবে এটি নিশ্চিত করে যে আপনার মানদণ্ডটি যথেষ্ট পরিমাণে পূরণ করে।

আউট | মাথা -c840
$ ./a.out | মাথা -c840 | perl tester.pl
পরীক্ষা 2: 1 (1) 2.933333333333333 (3) 3.1 (3) 0.966666666666667 (1)
পরীক্ষা 3: 214 99 71 24 7 5 1 1 2 2
পরীক্ষা 4: 0.495238095238095

পিরিয়ড দৈর্ঘ্য 2²⁹।


6
এটি প্রমাণ করে যে এমন কিছু থেকে এলোমেলোতা বলা কতটা কঠিন যা ব্যাপকভাবে অস্তিত্বের মধ্যে সবচেয়ে খারাপ র্যান্ডম সংখ্যার জেনারেটর হিসাবে পরিচিত। +1 টি।
PhiNotPi

8

গণিতের 78 53 টি চর

পাইয়ের বাইনারি উপস্থাপনের অঙ্কগুলি এমন আচরণ করে বলে মনে হচ্ছে যেন তারা চঞ্চলভাবে উত্পাদিত হয় যদিও এটি অপ্রমাণিত।

নিম্নলিখিত সাধারণ রুটিন নির্ধারিতভাবে পাই এর বাইনারি অঙ্কগুলি স্ট্রিং হিসাবে dদশমিক অঙ্কের সাথে প্রত্যাবর্তন করে :

f[d_]:=ToString@FromDigits@RealDigits[N[Pi,d],2][[1]]

ব্যবহার

যদি আমরা পাই এর 301 দশমিক অঙ্কের প্রতিপক্ষকে অনুরোধ করি তবে আমরা 1000 বাইনারি সংখ্যা পাই।

f[301]
StringLength[%]

(* out *)
1100100100001111110110101010001000100001011010001100001000110100110001001100011001100010100010111000000011011100000111001101000100101001000000100100111000001000100010100110011111001100011101000000001000001011101111101010011000111011000100111001101100100010010100010100101000001000011110011000111000110100000001001101110111101111100101010001100110110011110011010011101001000011000110110011000000101011000010100110110111110010010111110001010000110111010011111110000100110101011011010110110101010001110000100100010111100100100001011011010101110110011000100101111001111110110001101111010001001100010000101110100110100110001101111110110101101011000010111111111101011100101101101111010000000110101101111110110111101110001110000110101111111011010110101000100110011111101001011010111010011111001001000001000101111100010010110001111111100110010010010010100001100110010100011110110011100100010110110011110111000010000000000111110010111000101000010110001110111111000001011001100011011010010010000011011000011100011

1000 (* characters *)

পাই যেহেতু অযৌক্তিক সংখ্যা, কোনও পিরিয়ড নেই। তবে, হার্ডওয়্যারটি চালু হওয়ার কারণে ব্যবহারিক বাধা থাকবে।

পরীক্ষা 1 আমার কাছে ভাল লাগছে।

পরীক্ষা 2

d=301;
Partition[RealDigits[N[Pi,d],2][[1]],{3}];
Tally[%]
(* out *)
{{{1,1,0},35},{{0,1,0},45},{{0,0,0},41},{{1,1,1},40},
{{0,1,1},50},{{1,0,1},32},{{1,0,0},43},{{0,0,1},47}}

আরও পুঙ্খানুপুঙ্খ চেক:

d=10^6;
Partition[RealDigits[N[Pi,d],2][[1]],{3}];
Tally[%]

{{{1,1,0},138565},{{0,1,0},138146},{{0,0,0},138260},{{1,1,1},138427},
{{0,1,1},139119}, {{1,0,1},138404},{{1,0,0},137926},{{0,0,1},138462}}

পরীক্ষা 3: রান

d=10^6;
res3=SortBy[Tally@Split@RealDigits[N[Pi,d],2][[1]],Last]/.{a_,b_}:> {Length[a],b}
ListPlot[res3 ,AxesLabel-> {"Run Length","Runs"},AxesOrigin->{0,0}]

রানের বিতরণটি নিয়মিতভাবে পরীক্ষা করতে আমি প্রচুর মামলা চালিয়েছি। প্রায় 3 মিলিয়ন বাইনারি সংখ্যায়, 1 টির 830k রান ছিল, 2 এর 416k রান, 3 টির 208k রান, 4 এর 104k রান ইত্যাদি,

2 রান পরীক্ষা 4: প্রথম এবং দ্বিতীয়ার্ধের তথ্যের মিল

ম্যাচগুলি 0 এবং 2 এর 212 টি মামলা; মিলগুলি হ'ল 208 টি ক্ষেত্রে যেখানে সম্পর্কিত অঙ্কগুলির যোগফল 1 হয়।

d=301;
Tally[Plus@@Partition[Take[RealDigits[N[Pi,d],2][[1]],840],420]]

(* out *)
{{1,208},{0,108},{2,104}}

টাইমিং

3321928 বাইনারি সংখ্যা (10 imal 6 দশমিক অঙ্কের সাথে) গণনা করতে এটি দুই সেকেন্ডের মধ্যে সময় নেয়।

(r=f[10^6]);//AbsoluteTiming
StringLength[r]

(*out*)
{1.785928,Null}    
3321928

1
আমি জানতাম যে কেউ এই কাজটি করবে ...
ঘড়ির

1
কম ঝুলন্ত ফল, তাই না?
ডেভিডসি

আপনি কি একটি বাইট সংরক্ষণ করার eপরিবর্তে ব্যবহার করতে পারেন pi?
পিপ্পারি

হয় eএলোমেলো বিতরণ?
ডেভিডসি

3

পাইথন, 90

g=[19]
print(''.join("01"[(g.append((11*g[-1]+13)%1024)or g[-1])>512]for i in range(1000)))

gবীজ মান হয়। এলোমেলো নমুনা উল্লেখযোগ্যভাবে সাধারণ বিতরণ প্রদর্শন করে যা পুনরায় নমুনার এলোমেলো নমুনা বোঝায় যার অর্থ এবং আ আ 0.506মানক বিচ্যুতি .0473(1000 এর নমুনা আকার) পাওয়া যায়। দুর্ভাগ্যক্রমে, এলোমেলোতা প্রাথমিক বীজের জন্য অত্যন্ত সংবেদনশীল। উপরের কোডের বীজটি আমাকে সেরা এলোমেলোভাবে দিয়েছে: পি

হালনাগাদ

আসুন দেখুন কীভাবে এই কোডটি ওপি'র পরীক্ষাগুলি ধরে রাখে:

পরীক্ষা # 1

এটাকে কিছুটা সাবজেক্টিভ ... তবে এটি আমার কাছে বেশ অনিয়মিত মনে হচ্ছে।

পরীক্ষা # 2

তিনটি 1: 0.141
দুটি 1 এর: 0.371
ওয়ান 1: 0.353
শূন্য 1 এর: 0.135

পরীক্ষা # 3

আকার দ্বারা চালিত:

8: 11
7: 3
6: 7
5: 13
4: 32
3: 67
2: 119
1: 216

পরীক্ষা # 4

সমতার অনুপাত: 0.94 এটি একটি টাইপো। শিগগিরই সঠিক নম্বর দিয়ে আপডেট হবে।


1
আপনি 'জন্য' এর আগে সাদা স্থানটি মুছে ফেলতে পারেন।
দানিরো

2

হাস্কেল 74 58

main=print$iterate(read.take 9.show.(^3))7>>=show.(`mod`2)

সরলীকরণের জন্য শিয়োনাকে ধন্যবাদ । ফলাফল:

/ সিউডোর্যান্ডম | মাথা -c 1000

./pseudorandom | মাথা -c 1000 | perl test.pl

পরীক্ষা 2: 0.966666666666667 (1) 2.4 (3) 3.3 (3) 1.33333333333333 (1)

পরীক্ষা 3: 260 108 66 33 15 11 5 2

পরীক্ষা 4: 0.495238095238095

এটি একটি ভয়ানক সিউডো-এলোমেলো জেনারেটরও (ভন-নিউমানের ব্যবহৃত একটির মতো)। যারা সচেতন ছিল না তাদের concatMap == (=<<) == flip . (>>=)জন্য (তালিকার জন্য)


আপনি প্রতিস্থাপন করতে পারেন \x->if odd x then"1"else"0"সঙ্গে show.(`mod`2)
shiona

1

প্রশ্নটি মূলত "একটি স্ট্রিম সাইফার বাস্তবায়নের" সমতুল্য। সুতরাং আমি আরসি 4 বাস্তবায়ন করি, যেহেতু এটি তুলনামূলকভাবে সহজ।

আমি কোনও কী ব্যবহার করি না এবং প্রথম 100000 বিটগুলি ফেলে রাখি কারণ আরসি 4 এর শুরুটি কিছুটা পক্ষপাতদুষ্ট, বিশেষত যেহেতু আমি মূল শিডিউলটি এড়িয়ে গেছি। তবে আমি এটি ছাড়াই আপনার পরীক্ষায় পাস হওয়ার আশা করব (কোডের 20 টি অক্ষর সংরক্ষণ করা)।

সাধারণত এক চক্র প্রতি একটি সম্পূর্ণ বাইট আউটপুট হবে, কিন্তু বাইনারি রূপান্তর করা C # তে বরং কুরুচিপূর্ণ, তাই আমি কেবলমাত্র সর্বনিম্ন উল্লেখযোগ্য বিট ব্যতীত সবকিছু বাতিল করে দেব।

var s=Enumerable.Range(0,256).ToArray();
byte i=0,j=0;
for(int k=0;;k++)
{
    i++;
    j+=(byte)s[i];
    var t=s[i];s[i]=s[j];s[j]=t;
    if(k>99999)
        Console.Write(s[i]+s[j]&1);
}

বা স্থান ছাড়াই:

var s=Enumerable.Range(0,256).ToArray();byte i=0,j=0;for(int k=0;;k++){i++;j+=(byte)s[i];var t=s[i];s[i]=s[j];s[j]=t;if(k>99999)Console.Write(s[i]+s[j]&1);}

সি #, 156 অক্ষর, লিনকপ্যাডের বিবৃতি মোডে কাজ করে। একটি সম্পূর্ণ সি # প্রোগ্রামের জন্য স্বাভাবিক বয়লারপ্লেট যুক্ত করুন।


আমরা ক্রিপ্টো আদিমগুলিতে অন্তর্নির্মিত (চিটার সমাধান) ব্যবহার করতে পারি:

var h=SHA256.Create();for(BigInteger i=0;;i++){Console.Write(h.ComputeHash(i.ToByteArray())[0]%2);}

(সি #, 99 টি অক্ষর, লিনকপ্যাডের বিবৃতি মোডে কাজ করে the সাধারণ সি # সংকলকের জন্য আপনাকে কিছুটা বয়লারপ্লেট যুক্ত করতে হবে)

ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলির আউটপুটটি এলোমেলো ডেটা থেকে পৃথক করার জন্য ডিজাইন করা হয়েছে, তাই আমি আশা করি এটি এলোমেলোভাবে পরীক্ষা করা সমস্ত (এলোমেলো মরে যাওয়া, ...) আপনি পাস করবেন তবে আমি পরীক্ষায় খুব অলস হয়েছি।


1

সি, 52 অক্ষর

main(a){for(a=1;putchar(48+a%2);a=a/2^-(a%2)&576);}

এটি একটি 10 ​​বিট এলএফএসআর, পরীক্ষার ফলাফল:

$ ./a.out |head -c 1000 | perl randtest.pl
Test 2: 1.13333333333333 (1) 2.86666666666667 (3) 3.16666666666667 (3) 0.833333333333333 (1)
Test 3:  251 122 64 32 16 8 4 2  1
Test 4: 0.466666666666667

a1 হিসাবে শুরু হওয়া উচিত, (ধরে নিলে এটি কোনও যুক্তি ছাড়াই ডাকা হয়েছে)। এছাড়াও আপনি a=মাঝখানে আটকে রাখতে পারেন, এরকম কিছু a=a/2^-!putchar(49-a%2)%576(অ্যালগোরিদমের সাথে কিছুটা স্বাধীনতা গ্রহণ)
ওয়ালেপেন

@ ওয়ালপেইন: আমার প্রাথমিক প্রয়োগটি সেট করা হয়নি a, " The program must not take any input from any external sources" এর কারণে আমি এটিকে পরিবর্তন করেছি
হাস্তুরকুন

1

সাগে / পাইথন

এই প্রোগ্রামটি ডানদিকের বাইনারি অঙ্কগুলি মুদ্রণ করে যা ফর্ম 3 3 3 3 প্রতিটি পর্যাপ্ত লম্বা ক্ষুদ্রাকৃতির টাওয়ারের জন্য সাধারণ । সম্ভবত যেগুলি সম্ভবত কার্যকরভাবে তৈরি করা যায়, তার জন্য গ্রাহামের সংখ্যার সবচেয়ে সঠিক বাইনারি অঙ্ক । অঙ্কের ক্রমটি অসীম, এবং পর্যায়ক্রমিক নয়।

m = 1; x = 3; last = 0
while True:
    m *= 2; x = pow(3,x,m); l = len(bin(x))
    print '1' if l > last else '0',
    last = l

1000 ডিজিটের জন্য, এটি 2 সেকেন্ডেরও কম সময় নিয়েছে; যাইহোক, সময় সংখ্যা সংখ্যা লিনিয়ার তুলনায় অনেক দ্রুত বৃদ্ধি হবে।

ওপি এর প্রোগ্রাম ব্যবহার পরীক্ষার ফলাফল হয়

Test 2: 1.26666666666667 (1) 3.16666666666667 (3) 2.8 (3) 0.766666666666667 (1)
Test 3:  268 126 61 30 20 7 2  1 1
Test 4: 0.466666666666667

(দেখুন জি র্যান্ডম এর সঠিকতম সংখ্যাগুলি ? 32000 এরও বেশি সংখ্যার অতিরিক্ত সংখ্যা এবং অতিরিক্ত পরিসংখ্যান পরীক্ষার জন্য))


1

জাভা, 371 317

একটি 128 বিট উপর ভিত্তি করে LFSR (বিআইটি কল থেকে এসেছ xilinx অ্যাপ্লিকেশন নোট 52 )

সম্পাদনা: বিগইন্টিজার ব্যবহার করে আমি সন্তুষ্ট নই তাই এই সংস্করণটি না করে। কিছু চরিত্র সংরক্ষণ করা হয়েছে। আউটপুট কিছুটা কম এলোমেলো হতে পারে কারণ আমি একটি ভাল 'বীজ' পদ্ধতিটি ভাবতে পারি না।

নতুন কোড : তর্কগুলি: BITS_TO_PRINT

class R{public static void main(String[]a){int L=65536;int[]v={0,128,126,101,99};int[]b=new int[L];for(int x=0;x<L;x++)b[x]=(x*x)&1;for(int i=0;i<Integer.parseInt(a[0])+L;i++){if(1!=(b[v[1]]^b[v[2]]^b[v[3]]^b[v[4]]))b[v[0]]=1;else b[v[0]]=0;if(i>L)System.out.print(b[v[0]]);for(int j=0;j<5;j++)v[j]=(v[j]-1)&(L-1);}}}

পুরাতন সংস্করণ: তর্কগুলি: বীজ, বিটস্ফ্র্যাপ_আরিন্ট

import java.math.BigInteger;class R{public static void main(String[]a){BigInteger v=new BigInteger(a[0]);BigInteger m=new BigInteger("ffffffffffffffffffffffffffffffff",16);for(int i=Integer.parseInt(a[1]);i>0;i--){v=v.shiftLeft(1);if(!(v.testBit(128)^v.testBit(126)^v.testBit(101)^v.testBit(99))){v=v.setBit(0);}v=v.and(m);java.lang.System.out.print(v.testBit(0)?1:0);}}}

নতুন সংস্করণ: উদাহরণ আউটপুট, বিট = 100:

011001100111000110010100100111011100100111000111001111110110001001100000100111111010111001100100011

1
বিটিডাব্লু, আমি ধরে নিচ্ছি যে পোস্ট থেকে নোহ উভয় অ্যাকাউন্টই একই ব্যক্তি। যদি তা হয় তবে আপনি কোনও মডারেটরকে তাদের meta.codegolf.stackexchange.com
পিটার টেলর

0

জাভাস্ক্রিপ্ট - 1000 সিউডো-এলোমেলো বিটের জন্য 1 মিমি থেকে 2 এমএস (100000 বিটের জন্য 139ms থেকে 153ms)

এই সমাধানটি বর্গমূলগুলি অযৌক্তিক এবং এইভাবে বেশ এলোমেলো এই বিষয়টি ব্যবহার করে। মূলত, এটি শুরু করতে 2 এর বর্গমূল লাগে, এটি বাইনারিতে রূপান্তরিত করে, পূর্ববর্তী মূলের সাথে মিলিত শীর্ষস্থানটি বের করে দেয়, এলোমেলো স্ট্রিংয়ে সংযোজন করে, পরবর্তী উচ্চতর সংখ্যার সাথে পুনরাবৃত্তি করে (অথবা যদি সংখ্যাটি পুনরাবৃত্তি হয় তবে 2 এ ফিরে আসে) এবং কমপক্ষে 30 বিট দীর্ঘ ছিল), এবং এটি যথেষ্ট দীর্ঘ হয়ে গেলে এলোমেলো স্ট্রিং প্রদান করে।

var getDeterministicPseudoRandString = function(length){
    var randString = '';

    var i = 2;
    var prevRand = '';

    outerLoop:
    while(randString.length < length){
        var nextRand, nextFullRand = Math.sqrt(i++).toString(2).substring(1).replace('.', '');
        nextRand = nextFullRand;
        for(var j = prevRand.length; j > 0; j--){
            var replaceString = prevRand.substring(0, j);

            nextRand = nextFullRand;

            if(nextFullRand.indexOf(replaceString) == 0){
                if(j == prevRand.length && j > 30){
                    //start i over at 2
                    console.log('max i reached: ' + i);

                    i = 2;
                    continue outerLoop;
                } else {
                    nextRand = nextFullRand.replace(replaceString, '');
                }

                break;
            }
        }
        prevRand = nextFullRand;

        randString += nextRand;
    }

    return randString.substring(0, length);//Return the substring with the appropriate length
};

আমি এখনও পরীক্ষাগুলি পেরিয়েছি না, তবে আমি তাদের কল্পনা করি যে এটি তাদের পক্ষে ভাল হবে। এখানে একটি মূর্খতা রয়েছে যাতে আপনি এটি কার্যকর অবস্থায় দেখতে পান। আমার সময়গুলির জন্য, আমি বেশ কয়েকবার প্রোগ্রামটি চালিয়েছি এবং রেঞ্জ হিসাবে দ্রুত এবং ধীর মান নিয়েছি।



0

পার্ল, 44 বাইট

আমি জানি এটি কোড গল্ফ নয়, তবে আমি সর্বদা একটি সাধারণ চতুষ্কোণ কার্যকারিতার নিম্ন অর্ডার বিট গ্রহণের অনুরাগী হয়েছি, যেমন:

$x=1/7;print substr($x*=4-4*$x,9,1)%2while 1

পিরিয়ড 3 বিলিয়ন এরও বেশি লম্বা, তবে আরও বেশি গণনা করার জন্য আমার ডিস্কের জায়গা চলে গেছে।


1
আপনি সংখ্যার ধ্রুবক এবং কীওয়ার্ডগুলি $x=1/7;print substr($x*=4-4*$x,9,1)%2while 1
জাস্টস্পোপস করে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.