একটি এলোমেলো ক্রমহ্রাসমান ক্রম নমুনা


20

ইনপুট: আপনার কোডের জন্য সুবিধাজনক যে কোনও আকারে দুটি পূর্ণসংখ্যা এন এবং কে দেওয়া আছে

আউটপুট , কে পূর্ণসংখ্যার এক এলোমেলো ক্রমহ্রাসমান ক্রম, প্রতিটি 1 থেকে n এর মধ্যে থাকে। নমুনাটি 1 থেকে n এর পরিসরের পূর্ণসংখ্যার সাথে k পূর্ণসংখ্যার সমস্ত অ-হ্রাসক্রমিক ক্রমগুলি থেকে অভিন্ন বাছাই করা উচিত।

আউটপুটটি যে কোনও যুক্তিসঙ্গত বিন্যাসে আপনার সুবিধাজনক বলে মনে হতে পারে।

আপনার প্রিয় লাইব্রেরি / ভাষা যা কিছু সিউডো-এলোমেলো জেনারেটর ব্যবহার করতে পারেন।

আমরা ধরে নিতে পারি যে পূর্ণসংখ্যা n, k> 0 0

উদাহরণ

বলুন এন, কে = ২. অ-ক্রমহীন ক্রমগুলি

1,1
1,2
2,2

প্রতিটি অনুক্রমের আউটপুট হওয়ার সম্ভাবনা 1/3 হওয়া উচিত।

সীমাবদ্ধতা

আপনার কোডটি k = 20 এবং n = 100 এর জন্য কয়েক সেকেন্ডের বেশি চলবে না।

কি কাজ করে না

আপনি যদি প্রতিটি পূর্ণসংখ্যাকে 1 থেকে n পরিসীমা পর্যন্ত এলোমেলোভাবে নমুনা দেন এবং তারপরে তালিকাটি সাজান আপনি অভিন্ন বিতরণ পাবেন না।


এন এর জন্য ক্রমহ্রাসমান ক্রমগুলির সংখ্যা নির্ধারণ করা, কে যদি ইতিমধ্যে এটি না করা হয়ে থাকে তবে নিজেই একটি আকর্ষণীয় চ্যালেঞ্জ তৈরি করতে পারে ...
ETH প্রোডাকশন

1
@ETHproductions না সত্যিই, এটা শুধু একটা দ্বিপদ (এর সাথে সম্পর্কিত এই )
Sp3000

@ Sp3000 আহ, ঠিক আছে। কীভাবে এটি দক্ষতার সাথে গণনা করা যায় তা নির্ধারণ করা আমার কাছে একটি মজাদার চ্যালেঞ্জ ছিল।
ETH প্রোডাকশনগুলি

আপনার প্রয়োজনীয়তা যে প্রতিটি অনুক্রমের আউটপুট হওয়ার সমান সম্ভাবনা রয়েছে বেশিরভাগ বাগানের বিভিন্ন পিআরএনজির সাথে সন্তুষ্ট করা সম্ভব নয় যেখানে কেবল 32 বা 48 বিট স্টেট থাকতে পারে। ওল্ফ্রামের মতে, এখানে 1, ..., 100 এর 535 কুইন্টিলিয়ন 20 এলিমেন্ট সাবকোয়েন্স রয়েছে (তাদের মধ্যে কতগুলি দুর্বল হয়ে পড়েছে তা পরীক্ষা করে নি)। 2 ^ 64 মাত্র 18 কুইন্টিলিয়ন।
সিনান Ünür

উত্তর:


1

আসলে , 14 12 বাইট

এই উত্তরটি Emigna এর 05AB1E উত্তর এবং এই ম্যাথ.এসই প্রশ্নের উত্তরগুলির ভিত্তিতে । গল্ফিং পরামর্শ স্বাগত! এটি অনলাইন চেষ্টা করুন!

;;ra+DR╚HS♀-

Ungolfing

      Implicit input n, then k.
;;    Duplicate k twice.
r     Push range [0...k] for later.
a     Invert the stack. Stack: n, k, k, [0...k]
+DR   Push the range [1..n+k-1].
╚     Shuffle the range. Stack: shuffled_range, k, [0...k]
H     Push the first k elements of shuffled_range. Call this increasing.
S     Sort increasing so the elements are actually increasing.
♀-    Subtract each element of [0...k] from each element of increasing.
      This gives us our non-decreasing sequence.
      Implicit return.

13

পাইথন, 89 বাইট

from random import*
lambda n,k:[x-i for i,x in enumerate(sorted(sample(range(1,n+k),k)))]

উত্পাদিত একটি অ-হ্রাসহীন পরিবর্তনের চেয়ে ক্রমবর্ধমান ক্রম করা সহজবোধ্য হবে: এটি এবং এর kমধ্যে বাছাই করা সংখ্যার কেবল একটি এলোমেলো উপসেট ।1n

তবে, আমরা ক্রমাগত সংখ্যার মধ্যে প্রতিটি ব্যবধানকে ১ দ্বারা সঙ্কুচিত করে ক্রমবর্ধমান ক্রমটিকে অ-হ্রাসকারী একে রূপান্তর করতে পারি। সুতরাং, 1 এর ফাঁক 0 টি ফাঁক হয়ে সমান সংখ্যা তৈরি করে। এটি করতে, এর iদ্বারা 'তম বৃহত্তম মান হ্রাস করুনi

r[0], r[1], ..., r[n-1]  =>  r[0]-0, r[1]-1, ..., r[n-1]-(n-1)

ফলাফল হতে অন্যটির 1জন্য n, ইনপুটটি অবশ্যই হতে 1হবে n+k-1। এটি মধ্যবর্তী সংখ্যার ক্রমহ্রাসমান ক্রমগুলির মধ্যে একটি সক্ষমতা দেয়1 এবং nমাঝে সিকোয়েন্স বাড়ানোর, 1এবং n+k-1। এই ধরণের ক্রমগুলি গণনা করার জন্য তারা এবং বারের যুক্তিতে একই হস্তক্ষেপ ব্যবহৃত হয় ।

কোডটি পাইথন ফাংশনটি ব্যবহার করে random.sampleযা গ্রহণ করেk ইনপুট তালিকা থেকে প্রতিস্থাপন ছাড়াই নমুনা । এটি বাছাই ক্রমবর্ধমান ক্রম দেয়।


এটি চিত্তাকর্ষক। আপনি দয়া করে পদ্ধতির একটি ব্যাখ্যা যোগ করতে পারেন?

হ্যাঁ, এখন ব্যস্ত, পরে ব্যাখ্যা করবে।
xnor

আমি 90 বাইট গণনা করেছি ... (এবং আপনি import*1 বাইট সংরক্ষণ করতেও পারেন )
রড

@ রড ধন্যবাদ, আমি সে সম্পর্কে ভুলে গেছি
xnor


7

পাইথন, 87 বাইট

from random import*
f=lambda n,k:k>random()*(n+k-1)and f(n,k-1)+[n]or k*[7]and f(n-1,k)

সম্ভাব্যতা যে সর্বাধিক সম্ভাব্য মান nঅন্তর্ভুক্ত করা হয় সমান k/(n+k-1)। এটি অন্তর্ভুক্ত করতে, এটি তালিকার শেষে রাখুন, এবং প্রয়োজনীয় সংখ্যাগুলি হ্রাস করুন k। এটি বাদ দিতে উপরের সীমাটি হ্রাস করুন n। তারপরে, পুনরূদ্ধার করুন যতক্ষণ না কোনও মান প্রয়োজন হয় (k==0

পাইথনের randomকোনও বার্নোল্লি ভেরিয়েবলের জন্য বিল্ট-ইন নেই বলে মনে হচ্ছে: কিছু সম্ভাবনা সহ 1 এবং অন্যথায় 0। সুতরাং, 0 এবং 1 এর মধ্যে একটি এলোমেলো মান randomনীচে পড়ার ফলে এটি পরীক্ষা করে k/(n+k-1)। পাইথন 2 would ভাসা বিভাগ হিসেবে অনুপাত, তাই আমরা পরিবর্তে সংখ্যাবৃদ্ধি দ্বারা হর: k>random()*(n+k-1)


এখানে কি অস্পষ্ট সাহায্য করবে?

@ ললেবিক ভাল চিন্তা, তবে দেখে মনে হচ্ছে আপনাকে আমদানি করতে হবে numpy.random, যা অনেক দীর্ঘ।
xnor

5

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30+), 74 বাইট

(n,k,i=0,j=k)=>[for(_ of Array(q=k+n-1))if(Math.random(++i)<k/q--)i-j+k--]

ব্যাখ্যা

xnor এর দুর্দান্ত পাইথন উত্তরে এখানে / কীভাবে ব্যবহৃত প্রযুক্তিটি কাজ করে তার একটি খুব ভাল সংক্ষিপ্তসার রয়েছে। প্রথম পদক্ষেপটি [1, 2, ..., n + k - 1] সীমাটি তৈরি করা হয় :

(n,k,i=0)=>[for(_ of Array(q=k+n-1))++i]

এরপরে আমাদের এই ব্যাপ্তি থেকে কে এলোমেলো আইটেম নেওয়া দরকার । এটি করার জন্য, আমাদের সম্ভাব্যতা s / q সহ প্রতিটি আইটেম নির্বাচন করতে হবে , যেখানে s এখনও প্রয়োজনীয় আইটেমের সংখ্যা এবং q হল পরিসরে থাকা আইটেমের সংখ্যা। যেহেতু আমরা একটি অ্যারে উপলব্ধি ব্যবহার করছি, এটি মোটামুটি সহজ:

(n,k,i=0)=>[for(_ of Array(q=k+n-1))if(Math.random(++i)<k/q--)k--&&i]

এটি আমাদের সংখ্যার অভিন্ন বিতরণ ক্রমবর্ধমান ক্রম দেয় । এই আইটেম সংখ্যা যতবার সংশোধন করা যেতে পারে যে আমরা পূর্বে খুঁজে পেয়েছি:

(n,k,i=0,j=0)=>[for(_ of Array(q=k+n-1))if(Math.random(++i)<k/q--)k--&&i-j++]

অবশেষে, মজুত করে মধ্যে , আমরা একত্রীভূত করতে পারেন k--অভিব্যক্তি মধ্যে এবং কয়েক বাইট সংরক্ষণ করুন:

(n,k,i=0,j=k)=>[for(_ of Array(q=k+n-1))if(Math.random(++i)<k/q--)i-j+k--]

2

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

Prompt N,K
K→dim(L1
While K
If rand<K/(N+K-1
Then
N→L1(K
K-1→K
Else
N-1→N
End
End
Disp L1

একটি ছোট ক্যাভ্যাট সহ, এর এক্সনোর যুক্তি অনুসরণ করুন। আমরা তাত্ত্বিকভাবে এরকম কিছু করে বাইট শেভ করতে পারি:

K>rand(N+K-1

তবে র্যান্ড (এলোমেলো সংখ্যার একটি তালিকা তৈরির জন্য সংরক্ষিত, তাই বাইট সংরক্ষণ করার জন্য আমরা কাঙ্ক্ষিত অন্তর্নিহিত গুণটি করতে সক্ষম হব না।

সীমাবদ্ধতা অনুসারে এটি একটি 84+ এর উপরে শালীনভাবে দ্রুত চালানো উচিত তবে আমি কখন পারব তা নিশ্চিত করার জন্য যাচাই করব।


1

পিএইচপি, 77 75 73 বাইট

foreach(array_rand(range(2,$argv[1]+$k=$argv[2]),$k)as$v)echo$v+1-$i++,_;

এভাবে চালান:

php -r 'foreach(array_rand(range(2,$argv[1]+$k=$argv[2]),$k)as$v)echo$v+1-$i++,_;' -- 10 5 2>/dev/null;echo
> 1_4_6_9_9_

ব্যাখ্যা

foreach(                    # Iterate over...
  array_rand(               #   a (sorted) random number of items from...
    range(                  #     an array with items...
      2,                    #       from 2
      $argv[1]+$k=$argv[2]  #       to n + k (set arg 2 to $k)
    ),
    $k                      #     Take k number of items (their keys)
  )
  as $v
)
  echo $v +1 - $i++,"_";    # Print the value subtracted by the index.
                            # Need to add 1, because keys are 0-indexed.

বদলান

  • end()কল সরিয়ে 2 বাইট সংরক্ষণ করা হয়েছে এবং যুক্তির অ্যাক্সেস সংক্ষিপ্ত $argv[2]করতে $kপরিবর্তে সেট করুন
  • পূর্ববর্তী থেকে সূচকটি সরিয়ে 2 বাইট সংরক্ষণ করা হয়েছে, যেহেতু এটি কেবল একটি বাড়ানোর সংখ্যা। $iপরিবর্তে প্রতিটি পুনরাবৃত্তি বৃদ্ধি

প্রথম জাভাস্ক্রিপ্ট এবং এখন পিএইচপি। সমস্ত সেরা বৈজ্ঞানিক প্রোগ্রামিং ভাষা :) আপনাকে ধন্যবাদ।

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