আপনি একটি ফাংশন র্যান্ড 5 () সরবরাহ করেছেন। এই ফাংশনটি পুরোপুরি এলোমেলোভাবে (সমান বিতরণ) 1 এবং 5 এর মধ্যে পূর্ণসংখ্যা দেয়।
1 এবং 7 এর মধ্যে পুরোপুরি এলোমেলো পূর্ণসংখ্যার উত্পাদন করতে র্যান্ড 5 () ব্যবহার করে র্যান্ড 7 () ফাংশন সরবরাহ করুন।
আপনি একটি ফাংশন র্যান্ড 5 () সরবরাহ করেছেন। এই ফাংশনটি পুরোপুরি এলোমেলোভাবে (সমান বিতরণ) 1 এবং 5 এর মধ্যে পূর্ণসংখ্যা দেয়।
1 এবং 7 এর মধ্যে পুরোপুরি এলোমেলো পূর্ণসংখ্যার উত্পাদন করতে র্যান্ড 5 () ব্যবহার করে র্যান্ড 7 () ফাংশন সরবরাহ করুন।
উত্তর:
জাভা - 61 অক্ষর
int rand7(){int s=0,c=7;while(c-->0)s+=rand5();return s%7+1;}
বৈধতার জন্য পরীক্ষক ড্রাইভার:
class Rand {
public static void main(String[] args) {
int[] nums = new int[7];
// get a lot of numbers
for(int i = 0; i < 10000000; i++) nums[rand7()-1]++;
// print the results
for(int i = 0; i < 7; i++) System.out.println((i+1) + ": " + nums[i]);
}
// just for rand5()
static java.util.Random r = new java.util.Random();
static int rand5() {
return r.nextInt(5)+1; // Random.nextInt(n) returns 0..n-1, so add 1
}
static int rand7(){int s=0,c=7;while(c-->0)s+=rand5();return s%7+1;}
}
ফলাফল
C:\Documents and Settings\glowcoder\My Documents>java Rand
1: 1429828
2: 1429347
3: 1428328
4: 1426486
5: 1426784
6: 1429853
7: 1429374
C:\Documents and Settings\glowcoder\My Documents>
rand5
। আমি ম্যাপলে এগুলিকে সাধারণ ম্যাট্রিক্স বীজগণিত ব্যবহার করে গণনা করেছি, তবে আপনি যদি চান তবে কয়েক মিনিটের মধ্যে এটি পেন্সিল এবং কাগজ দিয়ে করতে পারেন। যাইহোক, এটি প্রমাণিত হয়েছে যে ওমর ইতিমধ্যে কয়েক দিন আগে অন্য উত্তরের মন্তব্যে একই পরিসংখ্যান (সান নরমালাইজিং ফ্যাক্টর) পোস্ট করেছেন । (এছাড়াও পি। এস।, আপনি কেবল মন্তব্য অনুসারে একজন ব্যবহারকারীকেই বিজ্ঞপ্তি দিতে পারবেন, যদিও পোস্টের লেখককে সর্বদা সর্বদা অবহিত করা হয়))
sub rand7{($x=5*&rand5+&rand5-3)<24?int($x/3):&rand7}
এছাড়াও আমি টেরিনারি অপারেটর এবং পুনরাবৃত্তি ব্যবহার করতে পারি। সর্বকালের সেরা দিন!
ঠিক আছে, আপনি যদি ডিভের পরিবর্তে মোড ব্যবহার করেন তবে 47 টি অক্ষর:
sub rand7{($x=5*&rand5+&rand5)<27?$x%7+1:&rand7}
&
এটি 46 টি অক্ষরে নামার জন্য শেষ দুটি চিহ্ন ফেলে দিতে পারেন (স্থান সহ যা আপনার বর্তমান সংস্করণটি 48 এ রাখে)।
রুবি - 54 টি অক্ষর (লুপ ব্যবহার করে ড্যান ম্যাকগ্রা সমাধানের ভিত্তিতে)
def rand7;x=8;while x>7 do x=rand5+5*rand5-5 end;x;end
রুবি - 45 টি অক্ষর (পুনরাবৃত্তি ব্যবহার করে একই সমাধান)
def rand7;x=rand5+5*rand5-5;x>7 ?rand7: x;end
(x=rand5+5*rand5-5)>7?
।
সাধারণ লিস্পে 70 টি অক্ষর:
(defun rand7()(let((n(-(+(rand5)(* 5(rand5)))5)))(if(> n 7)(rand7)n)))
প্রথম বন্ধনী আমার চেয়ে বেশি জায়গা নেয়।
(defun rand7()(setq n(-(+(rand5)(* 5(rand5)))5))(if(> n 7)(rand7)n))
(defun rand7()(if(>(setq n(-(+(rand5)(* 5(rand5)))5))7)(rand7)n))
সি / সি ++ এ প্রত্যাখ্যানের নমুনা ব্যবহার করে
int rand7(){int x=8;while(x>7)x=rand5()+5*rand5()-5;return x;}
62 অক্ষর।
while(x>7)
তাই, কেবলমাত্র বৈধ পরিসরে সংখ্যা দ্বারা সন্তুষ্ট হবে।
আর-তে (পরিসংখ্যানগত গণনার জন্য নির্মিত ভাষা), ইচ্ছাকৃতভাবে ছলচাতুরিযুক্ত সমাধান:
# Construct a Rand5 function
Rand5 <- function() sample(seq(5),1)
# And the golf
Rand7=function(r=Rand5())sample(1:(r/r+6),1)
# Or (same character count)
Rand7=function(r=Rand5())sample.int(r/r+6,1)
# Or even shorter(thanks to @Spacedman)
Rand7=function()sample(7)[Rand5()]
যুক্তিগুলির অলস মূল্যায়নের জন্য ধন্যবাদ, আমি সেমিকোলন এবং ধনুর্বন্ধনীগুলি মুছে ফেলেছি।
10 ^ 6 এর বেশি আউটপুট প্রতিলিপি:
> test <- replicate(10^6,Rand7())
> table(test)
test
1 2 3 4 5 6 7
142987 142547 143133 142719 142897 142869 142848
library(ggplot2)
qplot(test)
Rand7=function(){r=Rand5();sample(7)[r]}
Rand7=function(){sample(7)[Rand5()]}
def rand7:Int={val r=5*(rand5-1)+rand5
if(r<8)r else rand7}
র্যান্ড 5 থেকে 2 ইনপুট সহ:
\ 1 2 3 4 5
1 1 2 3 4 5
2 6 7 8 ..
3 11 ..
4 ..
5
আমি প্রথম -1 কে 5 দিয়ে গুণ করব এবং দ্বিতীয়টি যুক্ত করব। বেশিরভাগ ফলাফল উপেক্ষা করা হয় এবং একটি নতুন গণনার দিকে পরিচালিত করে। ফলাফলটি 1-25 থেকে মানের সমান বন্টন হওয়া উচিত, যা থেকে আমি কেবল প্রথম 7 টি পছন্দ করি। আমি একটি মডিউল তৈরির সাথে প্রথম 21 গ্রহণ করতে পারি, তবে এটি দীর্ঘ কোডের দিকে নিয়ে যাবে।
historicতিহাসিক কোড যা ব্যর্থ হয়েছে, তবে খুব স্পষ্টভাবে নয়। ইলমারী করোনেনকে এটিকে নির্দেশ করার জন্য ধন্যবাদ:
def rand7=(1 to 7).map(_=>rand5).sum%7+1
এই স্কেল -২.৮.০-পদ্ধতির জন্য যোশিটারু তকেশিতাকে ধন্যবাদ, যা 'সমষ্টি' এত সহজ করে তুলেছে। এর আগে আমার সমাধান:
def rand7=((0/:(1 to 7))((a,_)=>a+rand5-1))%7+1
rand5:
val rnd = util.Random
def rand5 = rnd.nextInt (5) + 1
def rand7=(1 to 7).map(_=>rand5).sum%7+1
int Rand4()
{
int r = Rand5();
return r > 4 ? Rand4() : r;
}
inline int Rand8()
{
return (Rand4() - 1) << 2 + Rand4();
}
int Rand7()
{
int r = Rand8();
return r > 7 ? Rand7() : r;
}
int Rand4(){int r=Rand5();return r>4?Rand4():r;}int Rand7(){int r=Rand4()-1<<2+Rand4();return r>7?Rand7():r;}
ড্যান ম্যাকগ্রা পোস্ট করেছেন উত্তর থেকে জাভাস্ক্রিপ্টে অনুবাদ করুন।
function Rand7(){x=8;while(x>7)x=rand5()+5*rand5()-5;return x}
62 অক্ষর
function Rand7(){for(x=8;x>7;x=rand5()+5*rand5()-5);return x}
সামান্য খাটো: পি
function Rand7(){for(x=0,i=1;i<8;x^=i*((k=Rand5())%2),i*=1+(k<5));return x?x:Rand7()}
আমি জানি ছোট উত্তর আছে, কিন্তু আমি এই ধাঁধাটির পরীক্ষাটি দেখাতে চেয়েছিলাম । দেখা যাচ্ছে যে ডেন ম্যাকগ্রা-র প্রত্যাখ্যানের নমুনা ব্যবহার করে কেবল ক্লাইড লাবোর উত্তর সঠিক (জেএস উত্তরের মধ্যে)।
int Rand7()
{
int r = Rand5();
int n = 5;
do {
r = (r - 1) * 5 + Rand5();
int m = n * 5 / 7 * 7;
if (r <= m) {
return r % 7 + 1;
}
r -= m;
n = n * 5 - m;
} while (1);
}
নম্বর বিতরণ (1000000 পূর্ণসংখ্যা):
142935 142751 142652 143299 142969 142691 142703
প্রতি উত্পন্ন পূর্ণসংখ্যার প্রতি র্যান্ড 5 () তে কলগুলির গড় সংখ্যা প্রায় 2.2 (2 থেকে 10+)।
1 2 3 4 5 6 7 8 9 10
0 840180 112222 44433 2212 886 0 60 6 1
জাভাতে (বা সি / সি ++ আমি মনে করি)
আলেকজান্দ্র্রু দ্বারা প্রজন্মের সূত্র ব্যবহার করে, 65 টি অক্ষরে:
int rand7(){int x=rand5()*5+rand5()-6;return x>20?rand7():x/3+1;}
ড্যান ম্যাকগ্রা দ্বারা প্রজন্মের সূত্র ব্যবহার করে, 60 টি অক্ষরে
int rand7(){int x=rand5()+5*rand5()-5;return x>7?rand7():x;}
পাইথনে অন্য একটি সমাধান যা ভুল হতে পারে:
rand7 = lambda: sum(rand5() for i in range(7)) % 7 + 1
এটি খুব সহজ বলে মনে হচ্ছে, তবে যখন আমি চেষ্টা করি:
counter = [0] * 7
for i in range(100000):
counter[rand7()] += 1
আমি যুক্তিসঙ্গত এমনকি বিতরণ পাই (সমস্ত 14000 এবং 14500 এর মধ্যে)।
ঠিক আছে, এখন কেউ যেমন এই পোস্টের পক্ষে ভোট দিয়েছেন: এই সমাধানটি কি সত্যই সঠিক? লোকেদের এটি সমালোচনা করার জন্য আমি আরও এখানে পোস্ট করেছি। ঠিক আছে, যদি এটি সঠিক হয় তবে আমার গল্ফযুক্ত সংস্করণটি হবে:
rand7=lambda:eval("+rand5()"*7)%7+1
যা 37 টি অক্ষরে আসে।
জাভা, 65 টি চর:
int rand7(){int r;do{r=rand5()+5*rand5()-5;}while(r>7);return r;}
def rand7():
while True:
n=5*(rand5()-1)+(rand5()-1)
if n<21:return n%7+1
কিন্তু সম্পূর্ণরূপে সঠিক যুক্তি উপর ভিত্তি করে এখানে ।
sub rand7{1while($_=5*&rand5-rand5)>6;$_+1}
এটি সম্পর্কে একটি সতর্কতা দেয় Ambiguous use of -rand5 resolved as -&rand5()
, কিন্তু সঠিকভাবে কাজ করে। &
দ্বিতীয় rand5
কলটিতে একটি প্রস্তুত করাও এটি একটি স্ট্রোকের মূল্যে স্থির করে। (বিপরীতে, প্রোটোটাইপ দিয়ে সংজ্ঞায়িত করা হলে অন্যটিও &
মুছে ফেলা যায় )) rand5
()
গীত। নিম্নলিখিত 46-চর সংস্করণটি প্রায় তিনগুণ দ্রুত:
sub rand7{1while($_=5*&rand5-rand5)>20;$_%7+1}
int rand7(){int s;while((s=rand5()*5+rand5())<10);return(s%7+1);}
পূর্বের রুটিনের চেয়ে দীর্ঘ, তবে আমি মনে করি এটি কম সময়ে অভিন্ন বিতরণ করা সংখ্যাগুলি প্রদান করে।
পোস্টস্ক্রিপ্ট (46)
এটি বাইনারি টোকেন এনকোডিং ব্যবহার করে, অতএব, এখানে একটি হ্যাক্সডাম্প রয়েছে:
00000000 2f 72 61 6e 64 37 7b 38 7b 92 38 37 92 61 7b 92 |/rand7{8{.87.a{.|
00000010 40 7d 69 66 92 75 32 7b 72 61 6e 64 35 7d 92 83 |@}if.u2{rand5}..|
00000020 35 92 6c 92 01 35 92 a9 7d 92 65 7d 92 33 |5.l..5..}.e}.3|
0000002e
এটা চেষ্টা করে দেখতে, আপনি এটিও করতে পারেন এটা বিনামূল্যে ডাউনলোড ।
এখানে পরীক্ষামূলক কোডের সাথে একত্রিত ও মন্তব্য করা কোড রয়েছে code
% This is the actual rand7 procedure.
/rand7{
8{ % potentialResult
% only if the random number is less than or equal to 7, we're done
dup 7 le{ % result
exit % result
}if % potentialResult
pop % -/-
2{rand5}repeat % randomNumber1 randomNumber2
5 mul add 5 sub % randomNumber1 + 5*randomNumber2 - 5 = potentialResult
}loop
}def
%Now, some testing code.
% For testing, we use the built-in rand operator;
% Doesn't really give a 100% even distribution as it returns numbers
% from 0 to 2^31-1, which is of course not divisible by 5.
/rand5 {
rand 5 mod 1 add
}def
% For testing, we initialize a dict that counts the number of times any number
% has been returned. Of course, we start the count at 0 for every number.
<<1 1 7{0}for>>begin
% Now we're calling the function quite a number of times
% and increment the counters accordingly.
1000000 {
rand7 dup load 1 add def
}repeat
% Print the results
currentdict{
2 array astore ==
}forall
int result = 0;
for (int i = 0; i++; i<7)
if (((rand(5) + rand(5)) % 2) //check if odd
result += 1;
return result + 1;
র্যান্ড 7 সংজ্ঞা দিন:
rand7=function(n)sample(7,n,T)
যেহেতু আর পরিসংখ্যানগত বিশ্লেষণকে মাথায় রেখেই লেখা হয়েছিল, এই কাজটি তুচ্ছ, এবং আমি অন্তর্নির্মিত ফাংশনটি sample
প্রতিস্থাপন সত্যের সাথে সেট করে ব্যবহার করি ।
নমুনা আউটপুট:
> rand7(20)
[1] 4 3 6 1 2 4 3 2 3 2 5 1 4 6 4 2 4 6 6 1
> rand7(20)
[1] 1 2 5 2 6 4 6 1 7 1 1 3 7 6 4 7 4 2 1 2
> rand7(20)
[1] 6 7 1 3 3 1 5 4 3 4 2 1 5 4 4 4 7 7 1 5
rand7={if(b==null)b=rand5();(b=(rand5()+b)%7+1)}
35,000 পুনরাবৃত্তির উপরে উদাহরণ বিতরণ:
[1:5030, 2:4909, 3:5017, 4:4942, 5:5118, 6:4956, 7:5028]
এটা রাষ্ট্রীয় যে খারাপ?
এ কেমন?
int Rand7()
{
return Rand5()+ Rand5()/2;
}
/
অপারেটর কি পূর্ণসংখ্যার গণিত করে? দশমিক, ভাসমান-পয়েন্ট বা পূর্ণসংখ্যার গণিত হলে আপনার ফলাফলগুলির কী হবে?
[2/25, 4/25, 5/25, 5/25, 5/25, 3/25, 1/25]
। ঠিক অভিন্ন নয়।
int m=0;int rand7(){return(m=m*5&-1>>>1|rand5())%7+1;}
বিতরণ পরীক্ষা:
[1000915, 999689, 999169, 998227, 1001653, 1000419, 999928]
অ্যালগরিদম:
> সংখ্যাগুলি পরস্পরকে আরও অসম্পর্কিত নয়, তবে স্বতন্ত্রভাবে পুরোপুরি এলোমেলো।
সি / সি ++ কোডের কোডটিতে কেবল একটি লাইন থাকে!
static unsigned int gi = 0;
int rand7()
{
return (((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1;
}
//call this seed before rand7
//maybe it's not best seed, if yo have any good idea tell me please
//and thanks JiminP again, he remind me to do this
void srand7()
{
int i, n = time(0);
for (i = 0; i < n % 7; i++)
rand7();
}
Srand7 () হল র্যান্ড 7 এর বীজ, অবশ্যই র্যান্ড 7 এর আগে এই ফাংশনটি কল করতে হবে ঠিক যেমন সি তে র্যান্টের আগে কল শ্রান্ডের মতো call
এটি খুব ভাল, কারণ এটি র্যান্ড () কেবলমাত্র একবারে কল করে এবং কোনও লুপ জিনিস নয়, অতিরিক্ত স্মৃতি ব্যয় করে না।
আমাকে এটি ব্যাখ্যা করতে দিন: 5 আকারের একটি পূর্ণসংখ্য অ্যারে বিবেচনা করুন:
1st get one number from 1 2 3 4 5 by rand5
2nd get one number from 2 3 4 5 6
3rd get one number from 3 4 5 6 7
4th get one number from 4 5 6 7 1
5th get one number from 5 6 7 1 2
5th get one number from 6 7 1 2 3
7th get one number from 7 1 2 3 4
সুতরাং আমরা টেবিলে পেয়েছি, 1-7 এর প্রত্যেকটি এতে 5 বার উপস্থিত হয়েছে এবং এর মধ্যে সমস্ত 35 টি সংখ্যা রয়েছে, সুতরাং প্রতিটি সংখ্যার সম্ভাবনা 5/35 = 1/7 হয়। এবং পরের বার,
8th get one number from 1 2 3 4 5
9th get one number from 2 3 4 5 6
......
পর্যাপ্ত সময়ের পরে, আমরা 1-7 এর অভিন্ন বিতরণ পেতে পারি।
সুতরাং, আমরা লুপ-বাম-শিফট দ্বারা 1-7 এর পাঁচটি উপাদান পুনরুদ্ধার করতে একটি অ্যারে বরাদ্দ করতে পারি, এবং র্যান্ড 5 দ্বারা অ্যারে থেকে প্রতিটি সময় একটি সংখ্যা পেতে পারি। পরিবর্তে, আমরা এর আগে সাতটি অ্যারে তৈরি করতে পারি এবং সেগুলি বিজ্ঞপ্তি দিয়ে ব্যবহার করতে পারি। কোডটিও সহজ, অনেকগুলি শর্ট কোড এটি করতে পারে।
তবে, আমরা% অপারেশনের বৈশিষ্ট্যগুলি ব্যবহার করতে পারি, সুতরাং টেবিল 1-7 সারিগুলি (র্যান্ড 5 + i)% 7 এর সমান, এটি: a = র্যান্ড ()% 5 + 1 সি ভাষায় র্যান্ড 5, বি = জিআই ++ % 7 উপরের সারণীতে সমস্ত ক্রিয়াকলাপ উত্পন্ন করে এবং 0 - 6 1 - 7 c = (a + b)% 7 + 1 প্রতিস্থাপন করে, 1 - 7 অভিন্নভাবে উত্পন্ন করে। অবশেষে, আমরা এই কোড পেয়েছি:
(((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1
তবে, আমরা প্রথম কলটিতে 6 এবং 7 পেতে পারি না, সুতরাং আমাদের একটি বীজ দরকার, কিছু কিছু সি / সি ++ এ র্যান্ডের জন্য, প্রথম আনুষ্ঠানিক কলের অনুমতি বাতিল করতে to
পরীক্ষার সম্পূর্ণ কোড এখানে:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static unsigned int gi = 0;
//a = rand() % 5 + 1 is rand5 in C language,
//b = gi++ % 7 generates all permutations,
//c = (a + b) % 7 + 1, generates 1 - 7 uniformly.
//Dont forget call srand7 before rand7
int rand7()
{
return (((rand() % 5 + 1) + (gi++ % 7)) % 7) + 1;
}
//call this seed before rand7
//maybe it's not best seed, if yo have any good idea tell me please
//and thanks JiminP again, he remind me to do this
void srand7()
{
int i, n = time(0);
for (i = 0; i < n % 7; i++)
rand7();
}
void main(void)
{
unsigned int result[10] = {0};
int k;
srand((unsigned int)time(0)); //initialize the seed for rand
srand7() //initialize the rand7
for (k = 0; k < 100000; k++)
result[rand7() - 1]++;
for (k = 0; k < 7; k++)
printf("%d : %.05f\n", k + 1, (float)result[k]/100000);
}
6
নাকি ? 7
int main(){if(rand7()==6) printf("Hello, world!");}
লুপ ব্যবহার করে আনুমানিকতা 'হ্যালো, ওয়ার্ল্ড!' প্রিন্ট করবে 7 বার 1, কিন্তু আপনার কোড না।