সলিটন বিতরণ অনুযায়ী আমি কীভাবে সংখ্যা তৈরি করতে পারি?


10

Soliton বন্টন একটি সেট উপর একটি বিযুক্ত সম্ভাব্যতা বিতরণের হয় সম্ভাবনা ভর ফাংশন{1,,N}

p(1)=1N,p(k)=1k(k1)for k{2,,N}

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

উত্তর:


9

আমরা যদি শুরু করি তবে (সংশোধিত) সিডিএফের জন্য প্রদান করে, টেলিস্কোপের অঙ্কের যোগফল। এই ইনভার্টারিং, এবং বিশেষ ক্ষেত্রে তদারক , নিম্নলিখিত অ্যালগরিদম দেয় (কোডেড , আমি ভীত, কিন্তু আপনি একটি পাইথন বাস্তবায়ন জন্য pseudocode যেমন নিতে পারে):k=211/kk=1R

rsoliton <- function(n.values, n=2) {
  x <- runif(n.values)         # Uniform values in [0,1)
  i <- ceiling(1/x)            # Modified soliton distribution
  i[i > n] <- 1                # Convert extreme values to 1
  i
}

এর ব্যবহারের (এবং একটি পরীক্ষা) উদাহরণ হিসাবে, আসুন জন্য মান আঁকুন :105N=10

n.trials <- 10^5
i <- rsoliton(n.trials, n=10)
freq <- table(i) / n.trials  # Tabulate frequencies
plot(freq, type="h", lwd=6)

কম্পাংক বন্টন


1
সম্পর্কিত "শক্তসমর্থ" সলিটন বিতরণের জন্য আপনাকে সম্ভবত কিছুটা কম দক্ষ সমাধানের জন্য সমাধান করতে হবে (বাইনারি অনুসন্ধান বা সমপরিমাণের উপর ভিত্তি করে)।
whuber

এত তাড়াতাড়ি আপনি কীভাবে এলে?
অ্যালেক্স চেম্বারলাইন

2
@ অ্যালেক্স চেম্বারলাইন কারণ তিনি ভাল: D
gui11aume

7

পাইথন ( @ হুইবার্স আর এর সমাধান থেকে গৃহীত )

from __future__ import print_function, division                                           
import random                                                                   
from math import ceil                                                           

def soliton(N, seed):                                                           
  prng = random.Random()                                                        
  prng.seed(seed)                                                                  
  while 1:                                                                         
    x = random.random() # Uniform values in [0, 1)                                 
    i = int(ceil(1/x))       # Modified soliton distribution                            
    yield i if i <= N else 1 # Correct extreme values to 1                         

if __name__ == '__main__':                                                         
  N = 10                                                                           
  T = 10 ** 5 # Number of trials                                                   
  s = soliton(N, s = soliton(N, random.randint(0, 2 ** 32 - 1)) # soliton generator                   
  f = [0]*N                       # frequency counter                              
  for j in range(T):                                                               
    i = next(s)                                                                    
    f[i-1] += 1                                                                    

  print("k\tFreq.\tExpected Prob\tObserved Prob\n");                               

  print("{:d}\t{:d}\t{:f}\t{:f}".format(1, f[0], 1/N, f[0]/T))                     
  for k in range(2, N+1):                                                          
    print("{:d}\t{:d}\t{:f}\t{:f}".format(k, f[k-1], 1/(k*(k-1)), f[k-1]/T))

নমুনা আউটপুট

k   Freq.   Expected Prob   Observed Prob

1   9965    0.100000    0.099650
2   49901   0.500000    0.499010
3   16709   0.166667    0.167090
4   8382    0.083333    0.083820
5   4971    0.050000    0.049710
6   3354    0.033333    0.033540
7   2462    0.023810    0.024620
8   1755    0.017857    0.017550
9   1363    0.013889    0.013630
10  1138    0.011111    0.011380

আবশ্যকতা

কোডটি পাইথন 2 বা 3 তে কাজ করা উচিত।


+1 পাইথন অনুবাদ ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ। আমাদের সাইটে আপনাকে স্বাগতম!
হোবার

কোন চিন্তা করো না. আমি যদি এলটি কোডগুলি কাজ করতে পারি তবে সেগুলি গিটহাবে থাকবে।
অ্যালেক্স চেম্বারলাইন

1
এখন @whuber এল টি বাস্তবায়ন GitHub । নিখুঁত নয়, তবে এটি একটি শুরু।
অ্যালেক্স চেম্বারলাইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.