দিনের র‌্যান্ডম গল্ফ # 2: একটি সাধারণ বিতরণ থেকে নম্বর


12

সিরিজ সম্পর্কে

প্রথমে, আপনি অন্য কোনও কোড গল্ফ চ্যালেঞ্জের মতো এটি ব্যবহার করতে পারেন এবং সিরিজটি মোটেও চিন্তা না করেই এর উত্তর দিতে পারেন। তবে, সমস্ত চ্যালেঞ্জ জুড়ে একটি লিডারবোর্ড রয়েছে। প্রথম পোস্টে সিরিজ সম্পর্কে আরও কিছু তথ্যের সাথে আপনি লিডারবোর্ডটি সন্ধান করতে পারেন ।

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

হোল 2: একটি সাধারণ বিতরণ থেকে নম্বর

আমি বিশ্বাস করতে পারি না এটি এখনও করা হয়নি! আপনি সাধারণ বন্টন থেকে অঙ্কন করে এলোমেলো সংখ্যা উত্পন্ন করবেন । কিছু নিয়ম (সেগুলির বেশিরভাগ সম্ভবত স্বয়ংক্রিয়ভাবে বেশিরভাগ জমা দেওয়া দ্বারা আচ্ছাদিত হয় তবে তাদের কয়েকটি বিস্তৃতভাবে বিভিন্ন ভাষার মধ্যে ফলাফলের ধারাবাহিকতা নিশ্চিত করার জন্য রয়েছে):

  • আপনাকে ইনপুট হিসাবে দুটি অ-নেতিবাচক পূর্ণসংখ্যার গ্রহণ করা উচিত : একটি বীজ Sএবং Nফেরতের জন্য সংখ্যার পরিমাণ । আউটপুটটি Nভাসমান পয়েন্ট সংখ্যাগুলির একটি তালিকা হতে হবে , গড় 0 এবং বৈকল্পিক 1 সহ একটি সাধারণ বিতরণ থেকে আঁকা । যখনই আপনার জমা দেওয়া একই বীজ দেওয়া হয় তখন Sএটি একই সংখ্যার উত্পাদন করা উচিত। বিশেষত, যদি এটি একবার এবং একবার সাথে কল করা হয় তবে দুটি আউটপুটগুলির প্রথম এন্ট্রিগুলি অভিন্ন হওয়া উচিত। তদ্ব্যতীত, কমপক্ষে 2 16 টি বিভিন্ন মানের বিভিন্ন ক্রম তৈরি করা উচিত।(S, N1)(S, N2)min(N1, N2)S

  • আপনি কোনও বিল্ট-ইন এলোমেলো সংখ্যা জেনারেটর ব্যবহার করতে পারেন যা কোনও (প্রায়) ইউনিফর্ম বিতরণ থেকে সংখ্যা আঁকতে নথিবদ্ধ থাকে তবে আপনি Sএটিতে যেতে পারেন এবং এটি কমপক্ষে 2 16 টি বিভিন্ন বীজ সমর্থন করে । যদি আপনি এটি করেন তবে আরএনজি আপনার যে কোনও প্রদত্ত সংখ্যার জন্য অনুরোধ করেছে তার জন্য কমপক্ষে 2 20 টি আলাদা মান ফিরে আসতে সক্ষম হবে।

  • আপনার উপলব্ধ অভিন্ন RNG একটি ছোট পরিসর থাকে, তাহলে না seedable বা সমর্থন খুব অল্প বীজ, আপনি হয় প্রথম উপরে একটি ভালোই বড় পরিসর একটি অভিন্ন RNG নির্মাণ করা আবশ্যক হয়, বিল্ট-ইন এক বা আপনি আপনার নিজের বাস্তবায়ন করতে হবে উপযুক্ত RNG ব্যবহার বীজ. এই পৃষ্ঠাটি এটির জন্য সহায়ক হতে পারে।
  • আপনি যদি সাধারণ বিতরণ উত্পন্ন করার জন্য একটি প্রতিষ্ঠিত অ্যালগরিদম বাস্তবায়ন না করেন তবে দয়া করে সঠিকতার প্রমাণ অন্তর্ভুক্ত করুন। উভয় ক্ষেত্রেই, আপনি যে অ্যালগরিদমটি বেছে নিয়েছেন তা অবশ্যই তাত্ত্বিকভাবে সঠিক সাধারণ বিতরণ (অন্তর্নিহিত পিআরএনজি বা সীমাবদ্ধ-নির্ভুলতা ডেটা সীমাবদ্ধতা ব্যতীত) দিতে হবে।
  • আপনার প্রয়োগটি ফ্লোটিং-পয়েন্ট সংখ্যাগুলি (কমপক্ষে 32 বিট প্রশস্ত) বা ফিক্স-পয়েন্ট সংখ্যা (কমপক্ষে 24 বিট প্রস্থ) ব্যবহার করা উচিত এবং সমস্ত গাণিতিক ক্রিয়াকলাপগুলি নির্বাচিত ধরণের পুরো প্রস্থের ব্যবহার করা উচিত।
  • আপনার অবশ্যই সাধারণ বিতরণ বা গাউসিয়ান ইন্টিগ্রালগুলির সাথে সম্পর্কিত কোনও বিল্ট-ইন ফাংশনগুলি ব্যবহার করা উচিত নয়, যেমন ত্রুটি ফাংশন বা এর বিপরীত।

আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন এবং এসটিডিআইএন, কমান্ড-লাইন আর্গুমেন্ট, ফাংশন আর্গুমেন্ট বা প্রম্পটের মাধ্যমে ইনপুট নিতে পারেন এবং রিটার্ন ভ্যালুতে বা এসটিডিআউট (বা নিকটতম বিকল্প) এ মুদ্রণ করে আউটপুট উত্পাদন করতে পারেন।

Sএবং Nঅ নেতিবাচক পূর্ণসংখ্যার, প্রতিটি কম 2 হতে হবে 20 । আউটপুট কোনও সুবিধাজনক, দ্ব্যর্থহীন তালিকা বা স্ট্রিং বিন্যাসে থাকতে পারে।

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম জমা (বাইটে) জিতেছে। এবং অবশ্যই, ব্যবহারকারী প্রতি সংক্ষিপ্ততম জমাটিও সিরিজের সামগ্রিক লিডারবোর্ডে প্রবেশ করবে।

লিডারবোর্ড

সিরিজের প্রথম পোস্টটি লিডারবোর্ড উত্পন্ন করে।

আপনার উত্তরগুলি প্রদর্শিত হবে তা নিশ্চিত করার জন্য, দয়া করে নীচের মার্কডাউন টেমপ্লেটটি ব্যবহার করে প্রতিটি উত্তর শিরোনাম দিয়ে শুরু করুন:

# Language Name, N bytes

Nআপনার জমা দেওয়ার আকারটি কোথায় ? আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন । এই ক্ষেত্রে:

# Ruby, <s>104</s> <s>101</s> 96 bytes

(ভাষাটি বর্তমানে দেখানো হয়নি, তবে স্নিপেটের প্রয়োজন এবং এটি বিশ্লেষণ করতে পারে এবং ভবিষ্যতে আমি একটি উপ-ভাষা লিডারবোর্ড যুক্ত করতে পারি))


অপেক্ষা করুন, আমাদের কি অ-পূর্ণসংখ্যা-রেঞ্জ আরএনজি ব্যবহার করার অনুমতি দেওয়া হচ্ছে?
mniip

PS 2 বিদ্যমান উত্তরগুলি মনে হচ্ছে [0, 1) ভাসমান পয়েন্ট আরএনজির, এটি কি অনুমোদিত?
mniip

@ এমনিপ হ্যাঁ, ভাসমান-পয়েন্ট আরএনজি অনুমোদিত, যদি তারা অভিন্ন, বীজযুক্ত এবং প্রয়োজনীয় সংখ্যক স্বতন্ত্র ভাসমান ফিরিয়ে দিতে সক্ষম হয় তবে তা অনুমোদিত।
মার্টিন ইন্ডার

উত্তর:


8

ডায়ালগ এপিএল, 33 বাইট

{(.5*⍨¯2×⍟?0)×1○○2×?0}¨⍳⎕⊣⎕rl←1+⎕

বক্স-মুলার :

⎕         ⍝ evaluated input
⎕rl←1+⎕   ⍝ set APL's random seed to 1+⎕ (S)
          ⍝   add 1 because ⎕rl←0 has special meaning: sets the seed randomly
{ }¨⍳N    ⍝ do the thing in braces N times
?0        ⍝ random number 0≤x<1
1○○2×A    ⍝ sin(2πA)
.5*⍨¯2×⍟B ⍝ sqrt(-2lnB)

আমি নিশ্চিত যে এটি অন্য কোনও ভাষায় মারতে পারে না।
জিরো ফাইবার

2
এটি এই নিয়মটি পূরণ করে না: "বিশেষত, যদি এটি একবার (এস, এন 1) এবং একবার (এস, এন 2) এর সাথে কল করা হয়, তবে দুটি আউটপুটগুলির প্রথম মিনিট (এন 1, এন 2) এন্ট্রিগুলি অভিন্ন হওয়া উচিত।"
মেরিনাস

@ মারিনাস ধন্যবাদ, স্থির। আমিও পরিবর্তিত ⎕rlহতে S+1কারণ ⎕rl←0বিশেষ অর্থ আছে।
এনজিএন

আপনার সম্ভবত সম্ভবত +1এটির দরকার নেই , কেবল এটিই বলে যা আপনার কমপক্ষে 2 ^ 16 বিভিন্ন মানকে সমর্থন করতে হবে। সুতরাং পরিসীমাটিতে সঠিকভাবে কাজ করা [১.২ ^ ১^] ঠিক হওয়া উচিত।
মেরিনাস

এস = 0 এটি গণনা পুনরাবৃত্তিযোগ্য করে তুলবে, যা আপনি উপরে উল্লিখিত বিধি লঙ্ঘন করে।
এনজিএন

8

আর, 68 বাইট

function(S,N){set.seed(S);sqrt(-2*log(runif(N)))*cos(2*pi*runif(N))}

এটি runif()ফাংশনটি ব্যবহার করে যা অভিন্ন বিতরণ থেকে এলোমেলোভাবে বিচ্যুত হয়। এলোমেলো সংখ্যা জেনারেশনের বীজটি ব্যবহার করে নির্দিষ্ট করা হয় set.seed(), যা ডিফল্টরূপে মরসেন-টুইস্টার অ্যালগরিদমটি 2 ^ 19937-1 অবধি ব্যবহার করে।

ফলাফল হ'ল দৈর্ঘ্য N এর একটি আর ভেক্টর যা গণিত মানকটি সাধারণ বিচ্যুত করে।

এটি বক্স-মুলার পদ্ধতিটি ব্যবহার করে: দুটি স্বতন্ত্র ইউনিফর্মের এলোমেলো ভেরিয়েবল ইউ এবং ভি এর জন্য, এখানে চিত্র বর্ণনা লিখুন


যদি এটি আর এর বৈধ বাক্য গঠন হয় তবে আপনি f=নামটি ছেড়ে দিতে পারেন (নামকরণের প্রয়োজন নেই তবে, নামকরণের ফাংশনগুলি যদি আপনার ভাষায় কোনও জিনিস থাকে)।
মার্টিন ইন্ডার

@ মার্টিনবাটনার: আমি এই পরামর্শটির প্রশংসা করি তবে আমার জ্ঞানের সাথে আর নামহীন ফাংশনটি দিয়ে কী করতে হবে তা জানতে পারছি না।
অ্যালেক্স এ।

আমি সর্বদা এর Error: unexpected '}' in "f=fu...পাশাপাশি একটি ত্রুটি বার্তা পাই , আপনি কি নিশ্চিত যে আপনি কল করলে এবং একই সাথে প্রথম নম্বর পেয়েছেন ? f(0,1)f(0,2)
flawr

4

ডায়ালগ এপিএল, 42 34

{⎕RL←⍺⋄{(.5*⍨¯2×⍟⍺)×1○⍵×○2}/?⍵2⍴0}

এটি এমন একটি ফাংশন যা Sএর বাম আর্গুমেন্ট এবং Nডান আর্গুমেন্ট হিসাবে গ্রহণ করে।

     5{⎕RL←⍺⋄{(.5*⍨¯2×⍟⍺)×1○⍵×○2}/?⍵2⍴0}10
3.019132549 ¯0.2903143175 ¯0.7353414637 1.421417015 2.327544764 ¯0.00005019747711 ¯0.9582127248 ¯0.2764568462
      ¯0.1602736853 ¯0.9912352616
     5{⎕RL←⍺⋄{(.5*⍨¯2×⍟⍺)×1○⍵×○2}/?⍵2⍴0}20
3.019132549 ¯0.2903143175 ¯0.7353414637 1.421417015 2.327544764 ¯0.00005019747711 ¯0.9582127248 ¯0.2764568462
      ¯0.1602736853 ¯0.9912352616 0.642585109 ¯0.2450019151 ¯0.415034463 0.03481768503 ¯0.4621212815 ¯0.760925979
      0.2592913013 1.884867889 ¯0.9621252731 0.3062560446

এটি ডায়ালগ এপিএলের অন্তর্নির্মিত এলোমেলো অপারেটর ব্যবহার করে বক্স-মুলার রূপান্তরের একটি বাস্তবায়ন, এটি ?ডিফল্টরূপে একটি মের্সেন টুইস্টার যা 64৪ -বিট মান দেয়, যা যথেষ্ট হওয়া উচিত।

ব্যাখ্যা:

  • ⎕RL←⍺: এলোমেলো বীজ সেট করুন
  • ?⍵2⍴0: 0 এবং 1 এর মধ্যে এলোমেলো সংখ্যার জোড়া তৈরি করুন।
  • {... }/: প্রতিটি জোড়ের জন্য নিম্নলিখিত ফাংশনটি প্রয়োগ করুন:
    • (.5*⍨¯2×⍟⍺)×1○⍵×○2: Z0মান গণনা করুন ( sqrt(-2 ln ⍺)×cos(2π⍵))।

1
ভি 14.0 এ ?00 এবং 1 এর মধ্যে একটি ভাসমান পয়েন্ট নম্বর দেয়
এনজিএন

3

পার্ল, 67

sub f{srand$_[0];map{cos(atan2(1,1)*rand 8)*sqrt-2*log rand}1..pop}

বাক্স-মুলার অন্যান্য এন্ট্রি হিসাবে। fক্রমে পরামিতি লাগে S, N

ব্যবহার করুন:

$ perl -le 'sub f{srand$_[0];map{cos(atan2(1,1)*rand 8)*sqrt-2*log rand}1..pop}print for f(5,3)'
-1.59212831801942
0.432167710756345
-0.533673305924252

3

জাভা, 164 161 বাইট

class B extends java.util.Random{B(int s,int n){super(s);for(;n-->0;System.out.println(Math.sqrt(-2*Math.log(nextDouble()))*Math.cos(2*Math.PI*nextDouble())));}}

এটি স্টাডআউট মাধ্যমে ফাংশন এবং আউটপুট মাধ্যমে ইনপুট লাগে। এটি বক্স-মুলার পদ্ধতিটি ব্যবহার করে।


5
s=0;s++<n;-> ;n-->0;?
Geobits

1
@ জিওবিটস ল্যাম্বডার মতো দেখায়: ডি
দ্য নম্বরওন

3

কমোডোর 64 বেসিক, 76 70 63 বাইট

1INPUTS,N:S=R/(-S):F┌I=1TON:?S●(-2*LOG(R/(1)))*S╮(2*π*R/(1)):N─

যেহেতু PETSCII অক্ষর সেটটিতে কিছু চিহ্ন রয়েছে যা ইউনিকোডে উপস্থিত নেই, তাই আমি বিকল্পগুলি তৈরি করেছি: /= SHIFT+N, = SHIFT+O, = SHIFT+Q, = SHIFT+I, =SHIFT+E

এটি সংখ্যা উত্পন্ন করতে স্ট্যান্ডার্ড বক্স-মুলার রূপান্তরটি প্রয়োগ করে; আমি ট্রান্সফর্মের অর্ধেক সিন (x) বাছাই করেছি কারণ কমোডোর 64 বেসিকের একটি দ্বি-চরিত্রের শর্টকাট রয়েছে sin()তবে এর জন্য নয় cos()

যদিও ম্যানুয়াল রাজ্যের অন্যথায়, যুক্তির মান RND করে ব্যাপার যদি একটি ঋণাত্মক সংখ্যা পাস করা হয়েছে, র্যান্ডম সংখ্যা উত্পাদক নিছক পুনরায় বীজযুক্ত নয়, এটা পুনরায় বীজযুক্ত হয় যে সংখ্যা সঙ্গে । এটি বীজকে অনেক সহজ করে তোলে: POKEপাঁচটি মেমরির অবস্থানের পরিবর্তে , আমাকে কেবল একটি ডু-নাথ কল করতে হবে RNDযা কোডটি দুটি লাইন / 121 বাইট থেকে 1 লাইন / 76 বাইটে হ্রাস করে।

সম্পাদনা করুন: আমি দুটি INPUTবিবৃতি একত্রিত করতে পারি এবং এই জায়গাটি after চ্ছিক ছিল তা বুঝতে পেরে গল্ফড ছয় বাইট বন্ধ TO

সম্পাদনা: গল্ফড আরও সাতটি বন্ধ: কমোডোর বেসিক আসলে পাইটিকে বিল্ট-ইন ধ্রুবক হিসাবে আছে এবং এটি একটি আধুনিক কীবোর্ডে এমনকি টাইপযোগ্য ( SHIFT+PgDnযদি আপনি ভাবছিলেন তবে)।


3

80386 মেশিন কোড, 72 বাইট

কোডের হেক্সডাম্প:

60 8b 7c 24 24 33 ed 8d 75 fb 8d 46 79 f7 e2 f7
f6 8b da b3 7f 0f cb d1 eb 89 1f d9 07 d9 e8 de
e9 33 ee 75 e5 d9 ed d9 c9 d9 f1 dc c0 d9 e0 d9
fa d9 c9 d9 eb de c9 dc c0 d9 ff de c9 d9 1f 83
c7 04 e2 c6 61 c2 04 00

সোর্স কোডটি এখানে (ভিজ্যুয়াল স্টুডিও দ্বারা সংকলিত হতে পারে):

__declspec(naked) void __fastcall doit(int count, unsigned seed, float* output)
{
    _asm {
                                // ecx = count
                                // edx = seed
        // save registers
        pushad;
        mov edi, [esp + 0x24];  // edi = pointer to output
        xor ebp, ebp;           // ebp = 0
        lea esi, [ebp - 5];     // esi = 4294967291 (a prime number)

    myloop:
        // Calculate the next random number
        lea eax, [esi + 121];   // eax = 116
        mul edx;
        div esi;
        mov ebx, edx;

        // Convert it to a float in the range 1...2
        mov bl, 0x7f;
        bswap ebx;
        shr ebx, 1;

        // Convert to range 0...1 and push onto the FPU stack
        mov [edi], ebx;
        fld dword ptr [edi];
        fld1;
        fsubp st(1), st;

        // Make 2 such random numbers
        xor ebp, esi;
        jnz myloop;

        // Calculate sqrt(-2*ln(x))
        fldln2;
        fxch;
        fyl2x;
        fadd st, st(0);
        fchs;
        fsqrt;

        // Calculate cos(2*pi*y)
        fxch st(1);
        fldpi;
        fmul;
        fadd st, st(0);
        fcos;

        // Calculate and write output
        fmulp st(1), st;
        fstp dword ptr [edi];
        add edi, 4;

        // Repeat
        loop myloop

        // Return
        popad;
        ret 4;
    }
}

এখানে আমি এএ ব্যবহার Lehmer র্যান্ডম সংখ্যা উত্পাদক । এটি নিম্নলিখিত অ্যালগরিদম ব্যবহার করে:

x(k+1) = 116 * x(k) mod 4294967291

এখানে 4294967291 একটি বড় (2 ^ 32-5) প্রধান সংখ্যা এবং 116 হ'ল একটি ছোট (128 এর চেয়ে কম; নীচে দেখুন) সংখ্যাটি এটির আদিম মূল । আমি এমন একটি আদিম রুট বেছে নিয়েছি যা বাইনারি উপস্থাপনায় (01110100) জিরো এবং এর বেশি বা কম র্যান্ডম বিতরণ রয়েছে। এই আরএনজির সর্বাধিক সম্ভাব্য সময়সীমা রয়েছে 4294967290, যদি বীজ ননজারো হয়।


আমি এখানে অপেক্ষাকৃত ছোট সংখ্যা ব্যবহার করেছি (116 এবং 4294967291, যা -5 হিসাবে উপস্থাপিত হতে পারে) আমাকে leaনির্দেশের এনকোডিংয়ের সুবিধা নিতে দিন :

8d 46 79     lea eax, [esi+121]

সংখ্যাটি 1 বাইটে ফিট করতে পারলে এটি 3 বাইটে একত্রিত হয়।


গুণ এবং বিভাগের ব্যবহার edxএবং eaxতাদের কার্যনির্বাহী রেজিস্টার হিসাবে, এই কারণেই আমি seedফাংশনে দ্বিতীয় প্যারামিটার তৈরি করেছি ( fastcallকলিং কনভেনশন edxদ্বিতীয় প্যারামিটারটি পাস করার জন্য ব্যবহার করে)। তদ্ব্যতীত, প্রথম প্যারামিটারটি পাস করা হয় ecxযা একটি কাউন্টার ধরে রাখার জন্য ভাল জায়গা: 1 টি নির্দেশে একটি লুপ সংগঠিত করা যায়!

e2 c6        loop myloop

একটি পূর্ণসংখ্যাকে একটি ভাসমান-পয়েন্ট সংখ্যায় রূপান্তর করতে, আমি একক-নির্ভুলতা ভাসমান-পয়েন্ট সংখ্যাগুলির উপস্থাপনাটি কাজে লাগিয়েছি: যদি আমি উচ্চ 9 বিট (ঘাঁটি) বিট প্যাটার্নে সেট করি 001111111এবং 23 লো বিটগুলিকে এলোমেলোভাবে ছেড়ে দিই, তবে 1 ... 2 ব্যাপ্তিতে একটি এলোমেলো নম্বর পান। আমি এখান থেকে ধারণা নিয়েছি । উচ্চ 9 বিট সেট করতে, আমি এতে কিছুটা বিট-ফিডলিং ব্যবহার করেছি ebx:

mov ebx, edx;    xxxxxxxx|yyyyyyyy|zzzzzzzz|aaaaaaaa
mov bl, 0x7f;    xxxxxxxx|yyyyyyyy|zzzzzzzz|01111111
bswap ebx;       01111111|zzzzzzzz|yyyyyyyy|xxxxxxxx
shr ebx, 1;      00111111|1zzzzzzz|zyyyyyyy|yxxxxxxx

দুটি এলোমেলো সংখ্যা তৈরি করতে, আমি 2 টি পুনরাবৃত্তির নেস্টেড লুপ ব্যবহার করেছি। আমি এটি দিয়ে সংগঠিত xor:

xor ebp, esi;    first time, the result is -5
jnz myloop;      second time, the result is 0 - exit loop

ভাসমান-পয়েন্ট কোডটি বক্স-মুলার রূপান্তরটি প্রয়োগ করে ।


2

হাস্কেল, 118  144 

import System.Random;h z=let(u,r)=random z in(cos$2*pi*fst(random r)::Float)*sqrt(-2*log u):h r;g=(.(h.mkStdGen)).take

ব্যবহারের উদাহরণ:

*Main> g 3 0x6AE4A92CAFA8A742
[0.50378895,-0.20593005,-0.16684927]
*Main> g 6 0x6AE4A92CAFA8A742
[0.50378895,-0.20593005,-0.16684927,1.1229043,-0.10026576,0.4279402]
*Main> g 6 0xE09B1088DF461F7D
[2.5723906,-0.5177805,-1.3535261,0.7400385,3.5619608e-3,-8.246434e-2]

রিটার্নের randomধরণটি সীমাবদ্ধ Float, যা random[0, 1) এ অভিন্ন ফ্লোট তৈরি করে। তারপরে এটি তালিকা তৈরির জন্য কিছু অর্থহীন যাদু সহ একটি সিম্পেপ বাক্স-মুলার সূত্র।


2

গল্ফলুয়া, 63 70

গল্ফ্লুয়া তথ্য এবং নির্দেশাবলী।

\g(n,s)`_ENV,b=M,{}rs(s)~@i=1,n b[i]=q(l(r()^-2))*c(r()*pi)$~b$

মানগুলি সহ একটি সারণী প্রদান করে। উদাহরণ হিসাবে আমি ব্যবহার করছি ~T.u( ), যা return table.unpack( )লুয়া হিসাবে একই ।

> ~T.u(g(3,1234567))
0.89302672974232 0.36330401643578 -0.64762161593981
> ~T.u(g(5,1234567))
0.89302672974232 0.36330401643578 -0.64762161593981 -0.70654636393063 -0.65662878785425
> ~T.u(g(5,7654321))
0.3867923683064 -0.31758512485963 -0.58059120409317 1.2079459300077 1.1500121921242

ফাংশনের পরিবেশকে M(ওরফে math) সেট করে প্রচুর অক্ষর সংরক্ষণ করা হয়েছিল ।


2

এসএএস, 108

আমি এর চেয়ে কম চেয়ে কম আর এর মধ্যে একটি উত্তর পোস্ট করেছি , তবে পিপিসিজিতে খুব কম এসএএস উত্তর রয়েছে, তবে কেন অন্যটি যুক্ত করবেন না?

%macro f(s,n);data;do i=1 to &n;x=sqrt(-2*log(ranuni(&s)))*cos(8*atan2(1,1)*ranuni(&s));put x;end;run;%mend;

কিছু সাদা স্থান সহ:

%macro f(s, n);
    data;
        do i = 1 to &n;
            x = sqrt(-2 * log(ranuni(&s))) * cos(8 * atan2(1, 1) * ranuni(&s));
            put x;
        end;
    run;
%mend;

এটি এমন ম্যাক্রো সংজ্ঞায়িত করে যা বলা যেতে পারে %f(5, 3)। ম্যাক্রো একটি ডেটা পদক্ষেপ কার্যকর করে যা 1 থেকে N এর পূর্ণসংখ্যার মধ্য দিয়ে যায় এবং প্রতিটি পুনরাবৃত্তিতে এটি বক্স-মুলার ব্যবহার করে একটি এলোমেলো স্বাভাবিক বিচ্যুতি গণনা করে এবং putবিবৃতিটি ব্যবহার করে লগটিতে মুদ্রণ করে ।

পাই এর জন্য এসএএসের কোনও অন্তর্নির্মিত ব্যবস্থা নেই, তাই আর্টট্যানজেন্টের সাহায্যে আমরা এটি করতে পারি সেরা it

ranuni()ফাংশন (যা অবচিত কিন্তু একটি দম্পতি নতুন ফাংশন কম অক্ষর প্রয়োজন হয়) একটি অভিন্ন বিতরণ থেকে একটি র্যান্ডম সংখ্যা ফেরৎ। এসএএস ডকুমেন্টেশন আরএনজি বাস্তবায়ন সম্পর্কে সম্পূর্ণ বিবরণ দেয় না কারণ এর সময়কাল 2 ^ 31-2 অবধি রয়েছে।

এসএএস ম্যাক্রোগুলিতে, ম্যাক্রো ভেরিয়েবলগুলি পূর্ববর্তী হিসাবে উল্লেখ করা হয় &এবং রান সময়ে তাদের মানগুলির সংকল্প করে।

আপনি সম্ভবত দেখেছেন, এসএএস একটি প্রতিযোগিতায় খুব কমই প্রকৃত প্রতিযোগী।


2

জাভা, 193 বাইট

যদিও এটি বর্তমান জাভা নেতাকে পরাজিত করে না, আমি হিসাবের ভিন্ন পদ্ধতি দেখানোর জন্য যাইহোক পোস্ট করার সিদ্ধান্ত নিয়েছি। এটি ওপেনজেডিকে-র একটি গল্ফ সংস্করণ nextGaussian()

class N extends java.util.Random{N(int s,int n){super(s);for(float a,v;n-->0;System.out.println(v*Math.sqrt(-2*Math.log(a)/a)))for(a=0;a>=1|a==0;a=v*v+(v=2*nextFloat()-1)*v)v=2*nextFloat()-1;}}

লাইন বিরতি সহ:

class N extends java.util.Random{
    N(int s,int n){
        super(s);
        for(float a,v;
            n-->0;
            System.out.println(v*Math.sqrt(-2*Math.log(a)/a)))
                for(a=0;
                    a>=1|a==0;
                    a=v*v+(v=2*nextFloat()-1)*v)v=2*nextFloat()-1;
    }
}

2
মার্সাগলিয়া ব্যবহারের জন্য +1 (বা স্ট্রেট-ফরোয়ার্ড বক্স-মুলার ব্যবহার না করার জন্য);)
মার্টিন ইন্ডার

এটি কি ল্যাম্বডা হতে পারে না? এর মতো কিছু:(s,n)->{java.util.Random r=new java.util.Random(s);for(float a,v;n-->0;System.out.println(v*Math.sqrt(-2*Math.log(a)/a)))for(a=0;a>=1|a==0;a=v*v+(v=2*r.nextFloat()-1)*v)v=2*r.nextFloat()-1;}
জাস্টিন

2
@ কুইনকুনাক্স আমি করতে পারি, এক বাইটের জন্য। তবে আমি এই সম্পর্কে মেটা সম্পর্কে বর্তমান sensক্যমতের যাই হোক না কেন, আমার আনুষ্ঠানিক কোডগুলিতে আমার ফাংশন ঘোষণাগুলি গোপন করতে পছন্দ করি না। আমার কাছে এটি একটি বাইট মূল্য;)
Geobits

2

টি-এসকিউএল, 155 বাইট

CREATE PROC R(@S BIGINT,@N INT)AS
DECLARE @ INT=0,@K INT=8388607WHILE @<@N
BEGIN
SELECT SQRT(-2*LOG(RAND(@S*@%@K)))*COS(2*PI()*RAND(@S*9*@%@K))SET @+=1
END

এক্সইসি আরএস, এন ব্যবহার করুন কারণ টি-এসকিউএল তে এসটিডিএনপিও নেই যেখানে যথাক্রমে এস এবং এন বীজ এবং এন রয়েছে N এস "এলোমেলো" উত্পাদন করবে (আরএএনডি (বীজ) একটি সত্যই খারাপ র্যান্ডম সংখ্যা বাস্তবায়ন) সিকোয়েন্সগুলি তৈরি করবে যখন এস> 2 ^ 16 (সম্ভবত এর আগে, তবে আমি এটির গ্যারান্টি দিচ্ছি না)। এখনও অবধি বেশিরভাগ সমাধানের মতো বক্স-মুলার ব্যবহার করে। 8388607 হ'ল 2 is 23-1, যা আশা করি 2 2 20 টি বিভিন্ন মান উত্পন্ন করবে।


2

পাওয়ারশেল, 164 বাইট

Param($s,$n)$q=2147483647
$a=GET-RANDOM -SETSEED $s
FOR(;$n---gt0;){$a=GET-RANDOM
$b=GET-RANDOM
[math]::SQRT(-2*[math]::LOG($a/$q))*[math]::COS(2*[math]::PI*$b/$q)}

বক্স-মুলারের সাথে সর্বাধিক উত্তর হিসাবে একই। পাওয়ারশেলের সাথে খুব অভিজ্ঞ নয়, তাই কোনও সাহায্যের গল্ফিংয়ের প্রশংসা করা হবে।


2

রুবি, 72 বাইট

->n,s{include Math;srand s;n.times{p sqrt(-2*log(rand))*sin(2*rand*PI)}}

ইনপুট (ল্যাম্বদা ফাংশন হিসাবে):

f.(6, 12353405)

আউটপুট:

-1.1565142460805273
0.9352802655317097
1.3566720571574993
-0.9683973210257978
0.9851210877202192
0.14709635752306677

PS: আমি এটি আরও গল্ফ করা যেতে পারে কিনা তা জানতে চাই। আমি মাত্র একটি শিক্ষানবিস।


@ মার্টিনবাটনার আমার ধারণা আমি আজকাল প্রচুর সি ব্যবহার করছি। পুরোপুরি সম্পর্কে ভুলে গেছি।
জিরো ফাইবার

2

মতলব, 77

প্রথম ইনপুটটি হওয়া উচিত n, দ্বিতীয়টি s

a=input('');
rand('seed',a(2));
for i=1:a;
    (-2*log(rand))^.5*cos(2*pi*rand)
end

2

অক্টাভা, 91 96 88 বাইট

function r=n(s,n)rand("seed",s);x=rand(2,n);r=cos(2*pi*x(1,:)).*sqrt(-2*log(x(2,:)));end

বা, সাদা স্থান সহ:

function r=n(s,n)
  rand("seed",s);
  x=rand(2,n);
  r=cos(2*pi*x(1,:)).*sqrt(-2*log(x(2,:)));
end

বীজটি সামনে স্থাপন করুন এবং বক্স-মুেলার পদ্ধতিটি ব্যবহার করুন।

এনবি: অক্টাভা এলোমেলো সংখ্যার অ্যারে তৈরি করতে দেয় এবং এই অ্যারেগুলিতে স্ট্যান্ডার্ড ক্রিয়াকলাপ ব্যবহার করতে পারে যা অ্যারে আউটপুট উত্পাদন করে। .*অপারেটর দুইটি অ্যারের গুণ উপাদান-বাই-উপাদান ফল হয়।


আমি মনে করি এটি শর্তগুলি পূরণ করে না, যদি আপনি কল করেন n(0,1)এবং n(0,2)আপনি বিভিন্ন প্রথম নম্বর পেয়ে থাকেন, তাই না?
flawr

ক্র্যাপ, আপনি সঠিক। আমি এটি ঠিক করেছি তবে এটির জন্য আমার 5 বাইট খরচ হয়েছে ...
dcsohl

2

পাইথ, 32 বাইট

পাইথন এখন নতুন ফাংশনগুলির কারণে সুপার পাইনে কোনও পাইথন ব্যবহার করা হচ্ছে না। তবুও আরেকটি বক্স-মুয়েলার।

 .xvzVQ*@_y.lOZ2.71 2.ty*3.14OZ1

শুরুতে সেই স্থানটি গুরুত্বপূর্ণ।

.xvz             Seed RNG with evaluated input
VQ               For N in second input
*                Multiplication
 @       2       Square root
   _y            Times negative 2
    .l )         Natural log
     OZ          Of random float (RNG with zero give [0, 1) float)
 .t       1      Cosine from list of trig functions
  y              Double
   *             Multiplication
    .nZ          Pi from constants list
    OZ           Random Float

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


1
এটি পাইথের বৈশিষ্ট্য ব্যবহার করে ( .nZ) যা বাস্তবায়িত হয়নি, যখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল। (এটি আজ বাস্তবায়িত হয়েছিল)) সুতরাং এই উত্তরটি প্রতিযোগিতার অংশ হওয়া উচিত নয় ( meta.codegolf.stackexchange.com/questions/4867/… )।
জাকুবে

কে, আমি 32 চর সমাধানে ফিরে আসব
মালটিসেন

হ্যাঁ, এটি আরও ভাল হবে। আপনি উত্তরের একটি পৃথক বিভাগে এখনও আপনাকে নতুন সমাধান দেখাতে পারেন। তবে আপনার প্রতিযোগিতামূলক কোডটি পুরানো পাইথের সাথে কাজ করা এক হওয়া উচিত।
জাকুবে

1
বিটিডব্লিউ, আমি মনে করি না যে 32 সমাধানটি বৈধ হওয়া উচিত। যেহেতু এটি প্রাথমিকভাবে এলোমেলো বীজ ব্যবহার করে, যা প্রায় 5 দিন আগে যুক্ত হয়েছিল।
জাকুবে

1

স্টাটা, 85 বাইট

di _r(s)_r(n)
set se $s
set ob $n
g a=sqrt(-2*ln(runiform()))*cos(2*runiform()*_pi)
l

স্ট্যান্ডার্ডের মাধ্যমে ইনপুট নেয় (প্রথম সংখ্যাটি এস, তারপরে এন)। এস কে বীজ সেট করে এন এর কাছে পর্যবেক্ষণের সংখ্যা সেট করে একটি পরিবর্তনশীল তৈরি করে এবং বক্স মুলার রূপান্তর মানকে এটির মান সেট করে (এটি দেখানোর জন্য @ অ্যালেক্সকে ধন্যবাদ)। তারপরে একটি টেবিলের সমস্ত পর্যবেক্ষণকে কলাম শিরোনাম ক এবং তার পাশের পর্যবেক্ষণ সংখ্যাগুলি তালিকাভুক্ত করে। যদি এটি ঠিক না থাকে তবে আমাকে জানান, এবং আমি শিরোনাম এবং / অথবা পর্যবেক্ষণ নম্বরগুলি সরাতে পারি।


1

আর, 89 বাইট

আমি জানি আর এর আগেও হয়ে গেছে তবে আমি বাক্স-মুলারের চেয়ে আলাদা পদ্ধতির দেখাতে চেয়েছিলাম যা প্রত্যেকে ব্যবহার করেছিল। আমার সমাধান কেন্দ্রীয় সীমাবদ্ধ তত্ত্বটি ব্যবহার করে ।

f=function(S,N){set.seed(S);a=1000;for(i in(1:N)){print(sqrt(12/a)*(sum(runif(a))-a/2))}}

1
আমি ভীত, কেন্দ্রীয় সীমাবদ্ধ তত্ত্বটি সন্তুষ্ট করে না "আপনি যে অ্যালগরিদম পছন্দ করেছেন তা অবশ্যই তাত্ত্বিকভাবে সঠিক স্বাভাবিক বিতরণ পাওয়া উচিত"। আপনি যতগুলি ইউনিফর্ম ভেরিয়েবল যুক্ত করেন তা যতক্ষণ না, যতক্ষণ যোগফল সীমাবদ্ধ হয়, সাধারণ বন্টন সর্বদা আনুমানিক হবে। (যদিও কেন্দ্রীয় সীমাবদ্ধ তত্ত্বটি একটি দুর্দান্ত ধারণা, তবুও আমি এটিকে স্পষ্টভাবে রায় দিতে aহয়েছিল কারণ আপনার কোডে কোন মানটি ব্যবহার করা উচিত তা পরিষ্কার নয় যে ফলাফলটি "ন্যায্য" is)
মার্টিন ইন্ডার

1
এটি একটি শটের মূল্য;)
মিশাল

1

টিআই-বেসিক, 74 বাইট

Prompt S,N:S→rand:For(X,1,N:0→A:0→V:0→W:While A≥1 or A=0:2rand-1→V:2rand-1→W:V²+W²→A:End:Disp VW√(Aֿ¹-2log(A:End

1      1111111   11   1111111111111111111     1111   111111   1111111   11111111111111  11    111111111   111

¹আসলে বিপরীত অপারেটর।


1

পার্ল, 150 108 107 বাইট

এটি মার্সাগলিয়া পোলার পদ্ধতি ব্যবহার করে । F (এস, এন) দিয়ে ডাকা হয়েছে।

$aএর হিসাবের মধ্যে অ্যাসাইনমেন্ট সরিয়ে নিয়েছে $c

107:

sub f{srand$_[0];map{do{$c=($a=-1+2*rand)**2+(-1+2*rand)**2}until$c<1;print$a*sqrt(-2*log($c)/$c)}1..$_[1]}

অতিরিক্ত নম্বর স্টোরেজ এবং এর সংজ্ঞাটি সরানো হয়েছে $b

108:

sub f{srand$_[0];map{do{$a=-1+2*rand,$c=$a**2+(-1+2*rand)**2}until$c<1;print$a*sqrt(-2*log($c)/$c)}1..$_[1]}

150:

sub f{srand$_[0];map{$h?$h=!print$s:do{do{$a=-1+2*rand,$b=-1+2*rand,$c=$a*$a+$b*$b}until$c<1;$d=sqrt(-2*log($c)/$c);$s=$b*$d;$h=print$a*$d;}}1..$_[1]}

1

সুইফ্ট, 144 142

কিছুই চালাক নয়, কেবল সুইফট কীভাবে কাজ করে তা দেখে।

import Foundation;func r(s:UInt32,n:Int){srand(s);for i in 0..<n{println(sqrt(-2*log(Double(rand())/0xffffffff))*sin(2*Double(rand())*M_PI))}}

আমি আশা করছিলাম আমি (0 ... n) .map {use ব্যবহার করতে পারব তবে আপনি পরামিতি ব্যবহার না করে সংকলকটি মানচিত্র {recognize চিনতে পারে না বলে মনে হচ্ছে।


অবশ্যই...? এটিforEach যদি আপনি কোনও ফেরতের মান না চান এবং আমি অবশ্যই নিশ্চিত যে _ inএটি বাধ্যতামূলক
এএসসিআইআই-

/0xffffffffবিটিডব্লিউর জন্য কী
এএসসিআইআই



0

স্মাইলব্যাসিক, ৮১ বাইট

ঠিক আছে, এখন যেহেতু আমি প্রথম প্রশ্নের উত্তর দিয়েছি, আমাকে বাকি সমস্ত কিছু করতে হবে ...

এলোমেলো সংখ্যা তৈরি করা সস্তা, তবে আরএনজি বদ্ধকরণ ভাষায় দীর্ঘতম বিল্টিন ফাংশন ব্যবহার করে RANDOMIZE,।

DEF N S,N
RANDOMIZE.,S
FOR I=1TO N?SQR(-2*LOG(RNDF()))*COS(PI()*2*RNDF())NEXT
END

সূত্রটি অপ্টিমাইজ করার কিছু উপায় থাকতে পারে। দুটি আরএনজি কল কীভাবে ব্যবহার করা দরকার তা আমি দেখতে পাচ্ছি না।


বক্স-মুলার রূপান্তরের জন্য এটির জন্য দুটি স্বতন্ত্র নমুনা থাকা দরকার
এএসসিআইআই-
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.