একটি গোলকের এলোমেলো পয়েন্ট


31

চ্যালেঞ্জ

একটি প্রোগ্রাম বা ফাংশন যা কোন ইনপুট নেয় এবং দৈর্ঘ্যের একটি ভেক্টর আউটপুট লিখুন 1 একটি তাত্ত্বিক অভিন্ন র্যান্ডম দিক।

এটি x 2 + y 2 + z 2 = 1 দ্বারা বর্ণিত গোলকের একটি র্যান্ডম পয়েন্টের সমতুল্য

x2+y2+z2=1

যেমন একটি বিতরণ ফলে

ব্যাসার্ধ 1 এর সাথে একটি গোলকের এলোমেলো বিতরণ।

আউটপুট

তাত্ত্বিকভাবে অভিন্ন র্যান্ডম বিতরণ থেকে তিনটি ভাসমান যার জন্য x2+y2+z2=1 সমীকরণটি নির্ভুলতার সীমাতে সত্য holds

চ্যালেঞ্জ মন্তব্য

  • এলোমেলো বিতরণটি তাত্ত্বিকভাবে অভিন্ন হওয়া দরকার । অর্থাৎ যদি সিউডো-রেণ্ডম সংখ্যা উত্পাদক থেকে একটি সত্য RNG প্রতিস্থাপিত হতে ছিল বাস্তব সংখ্যা, এটা গোলক উপর পয়েন্ট একটি অভিন্ন র্যান্ডম বন্টন স্থাপিত হবে।
  • অভিন্ন বিতরণ থেকে তিনটি এলোমেলো সংখ্যা তৈরি করা এবং এগুলি স্বাভাবিক করা অবৈধ: ত্রিমাত্রিক জায়গার কোণার দিকে পক্ষপাত থাকবে।
  • একইভাবে, অভিন্ন বিতরণ থেকে দুটি এলোমেলো সংখ্যা উত্পন্ন করা এবং সেগুলি গোলাকার স্থানাঙ্ক হিসাবে ব্যবহার করা অবৈধ: গোলকের খুঁটির দিকে পক্ষপাত থাকবে।
  • যথাযথ অভিন্নতা সহ অ্যালগোরিদম দ্বারা অর্জন করা যেতে পারে তবে সীমাবদ্ধ নয়:
    • আশেপাশে একটি সাধারণ (গাউসিয়ান) বিতরণ থেকে তিনটি এলোমেলো সংখ্যা x , y এবং জেনারেট করুন এবং এগুলিকে সাধারণ করুন normalz00
    • জেনারেট করুন তিন র্যান্ডম সংখ্যা , এবং A থেকে অভিন্ন সীমার মধ্যে বন্টন । দ্বারা ভেক্টরের দৈর্ঘ্য গণনা । তারপরে,xyz( - 1 , 1 ) l = (1,1)l=x2+y2+z2l>1 হলে ভেক্টরটিকে প্রত্যাখাত করুন এবং একটি নতুন সংখ্যার সংখ্যা তৈরি করুন। অন্যথায়, l1 , ভেক্টরকে স্বাভাবিক করুন এবং ফলাফলটি ফিরিয়ে দিন।
    • পরিসরে ( 0 , 1 ) অভিন্ন বিতরণ থেকে দুটি এলোমেলো সংখ্যা i এবং j উত্পন্ন করুন এবং তাদেরকে এর মতো গোলাকার স্থানাঙ্কে রূপান্তর করুন: θ(0,1)
      θ=2×π×iϕ=cos1(2×j1)
      যাতেx,yএবংz x দ্বারা গণনা করা যায়
      x=cos(θ)×sin(ϕ)y=sin(θ)×sin(ϕ)z=cos(ϕ)
  • আপনার উত্তরে আপনি যে অ্যালগরিদম ব্যবহার করছেন তার সংক্ষিপ্ত বিবরণ সরবরাহ করুন।
  • ম্যাথওয়ার্ল্ডে গোলকের পয়েন্ট বাছাইয়ের বিষয়ে আরও পড়ুন ।

আউটপুট উদাহরণ

[ 0.72422852 -0.58643067  0.36275628]
[-0.79158628 -0.17595886  0.58517488]
[-0.16428481 -0.90804027  0.38532243]
[ 0.61238768  0.75123833 -0.24621596]
[-0.81111161 -0.46269121  0.35779156]

সাধারণ মন্তব্য


[-1, 1] এ 3 টি বাস্তবকে একত্রে চয়ন করা ঠিক আছে, তবে তাদের বর্গের যোগফল 1 না হলে তাদের প্রত্যাখ্যান করুন (এবং পুনরাবৃত্তি করুন)?
গ্রিমি

6
@ গ্রিমি আমার এই লুফোলটি পছন্দ করে না, এটি অনুমোদিত নয়, কারণ কোনও আউটপুটের তাত্ত্বিকভাবে শূন্য সম্ভাবনা রয়েছে।
জিতসে

@ গ্রিমির পরামর্শটি আপনার দ্বারা উল্লিখিত দ্বিতীয় উদাহরণ প্রয়োগের মতো নয় কি? এই সমাধানটিতে তাত্ত্বিকভাবে কোনও আউটপুট উত্পাদন করার শূন্য সম্ভাবনা রয়েছে
সাসওয়াত পাধি

2
@ সাসওয়াতপধি নং, এতে pi/6 ≈ 0.5236আউটপুট উত্পাদন করার সুযোগ রয়েছে। ইউনিটের অঞ্চল ঘনক্ষেত্রে লিখিত গোলকের অঞ্চলটি
লুইস মেন্ডো

1
@ লুইস মেন্ডো আমি দেখতে পাচ্ছি, ঠিক আছে। আপনার উল্লেখ হিসাবে সম্ভাবনা সেই ক্ষেত্রে 0.5 ডলার ~ গ্রিমির প্রস্তাবের জন্য, এটি 0 ডলার।
সাসওয়ত পাধি

উত্তর:



24

আর , 23 বাইট

x=rnorm(3)
x/(x%*%x)^.5

এটি অনলাইন চেষ্টা করুন!

এন(0,1) বিতরণের 3 বাস্তবায়ন উত্পন্ন করে ফলাফল ভেক্টরকে স্বাভাবিক করে তোলে।

1000 উপলব্ধির প্লট:

enter image description here


2
গোলকের উপর অভিন্ন বন্টনের ফলে সাধারণভাবে বিতরণ করা 3 অক্ষকে কী ন্যায়সঙ্গত করতে পারেন? (আমি এটি দেখতে পাচ্ছি না)
জেফ্রি

4
@ জেফ্রে এটি সম্ভাবনা / পরিসংখ্যানের ক্ষেত্রে বেশ সুপরিচিত; তবে 2 ডি (যা সুস্পষ্টভাবে 3 মাত্রায় প্রসারিত) এর প্রমাণ প্রায়: এবং স্বতন্ত্র। তারপরে এফ এক্স ( এক্স ) = কে - 1X,YN(0,1)এবংfY(y)=K-1fX(x)=Ke12x2, সুতরাং স্বাধীনতার দ্বারাfXY(x,y)=কে2-1fY(y)=Ke12y2যেখানেz- র=(x এর,Y), তাই এটা পরিষ্কার যে বিতরণেরz- রমাত্রার উপর নির্ভর করেz- র, এবং এইভাবে দিক অবিশেষে বিতরণ করা হয়। fXY(x,y)=K2e12(x2+y2)=fZ(z)=K2e12z2z=(x,y)zz
জিউসেপ

1
সুতরাং, সাধারন বন্টনের আমাদের অবিশেষে বিতরণ পয়েন্ট দেয় প্রায় বৃত্ত, এবং মাত্রার দ্বারা বিভাজক পয়েন্ট থাকা নিশ্চিত করে উপর বৃত্ত
: Giuseppe

23

x86-64 মেশিন কোড - 63 62 55 49 বাইট

6A 4F                push        4Fh  
68 00 00 80 3F       push        3F800000h  
C4 E2 79 18 4C 24 05 vbroadcastss xmm1,dword ptr [rsp+5]  
rand:
0F C7 F0             rdrand      eax  
73 FB                jnc         rand  
66 0F 6E C0          movd        xmm0,eax  
greaterThanOne:
66 0F 38 DC C0       aesenc      xmm0,xmm0  
0F 5B C0             cvtdq2ps    xmm0,xmm0  
0F 5E C1             divps       xmm0,xmm1  
C4 E3 79 40 D0 7F    vdpps       xmm2,xmm0,xmm0,7Fh  
0F 2F 14 24          comiss      xmm2,dword ptr [rsp]  
75 E9                jne         greaterThanOne
58                   pop         rax  
58                   pop         rax  
C3                   ret  

পরিবর্তিত, দ্বিতীয় অ্যালগরিদম ব্যবহার করে। [x, y, z, 0]Xmm0 এ ভেক্টর প্রদান করে।

ব্যাখ্যা:

push 4Fh
push 3f800000h

স্ট্যাকের ভাসমান হিসাবে 1 এবং 2 ^ 31 এর মানটি চাপায়। সাইন এক্সটেনশনের কারণে ডেটা ওভারল্যাপ হয়, কয়েকটি বাইট সংরক্ষণ করে।

vbroadcastss xmm1,dword ptr [rsp+5] Xmm1 এর 4 পজিশনে 2 ^ 31 এর জন্য মান লোড করে।

rdrand      eax  
jnc         rand  
movd        xmm0,eax

এলোমেলো 32-বিট পূর্ণসংখ্যার উত্পাদন করে এবং এটি xmm0 এর নীচে লোড করে।

aesenc      xmm0,xmm0  
cvtdq2ps    xmm0,xmm0  
divps       xmm0,xmm1 

একটি এলোমেলো 32 বিট পূর্ণসংখ্যার উত্পাদন করে, এটি ফ্লোটে রূপান্তর করুন (স্বাক্ষরিত) এবং -1 এবং 1 এর মধ্যে নম্বর পেতে 2 ^ 31 দ্বারা ভাগ করুন।

vdpps xmm2,xmm0,xmm0,7Fhউপরের ফ্লোটটি মুখোশ দিয়ে নিজেই ডট পণ্য ব্যবহার করে নিম্ন 3 টি ফ্লোটের স্কোয়ার যুক্ত করে। এটি দৈর্ঘ্য দেয়

comiss      xmm2,dword ptr [rsp]  
jne          rand+9h (07FF7A1DE1C9Eh)

দৈর্ঘ্য 1 এর সাথে তুলনা করে এবং মান 1 টির সমান না হলে মানগুলি প্রত্যাখ্যান করে। দৈর্ঘ্য বর্গক্ষেত্র যদি এক হয় তবে দৈর্ঘ্যটিও এক is এর অর্থ ভেক্টর ইতিমধ্যে স্বাভাবিক হয়ে গেছে এবং বর্গমূল এবং বিভাজনকে সংরক্ষণ করে।

pop         rax  
pop         rax 

স্ট্যাকটি পুনরুদ্ধার করুন।

ret xmm0 এ মান প্রদান করে

অনলাইনে চেষ্টা করুন


7
+1 aesenc128 "এলোমেলো" বিট উত্পাদন করতে ব্যবহার করা খুব সুন্দর।
ডকম্যাক্স

13

পাইথন 2 , 86 বাইট

from random import*;R=random
z=R()*2-1
a=(1-z*z)**.5*1j**(4*R())
print a.real,a.imag,z

এটি অনলাইন চেষ্টা করুন!

উত্পন্ন ব্যাসার্ধ্যের একটি বৃত্ত উপর -1 1. তারপর থেকে x এবং y স্থানাঙ্ক অবিশেষে নমুনা থেকে অবিশেষে Z-তুল্য (1-z*z)**.5

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

এই বৃত্তে একটি এলোমেলো কোণ উত্পন্ন করার জন্য, আমরা কল্পিত ইউনিটটিকে 1j0 থেকে 4 এর মধ্যে অভিন্ন র্যান্ডম শক্তিতে বাড়িয়ে তুলি যা আমাদের ট্রাই ফাংশন, পাই বা ই এর প্রয়োজন থেকে রক্ষা করে, যার যে কোনও একটি আমদানির প্রয়োজন হবে। এরপরে আমরা আসল কল্পিত অংশটি বের করি। আমরা যদি দুটি স্থানাঙ্কের জন্য একটি জটিল সংখ্যা আউটপুট করতে পারি তবে শেষ লাইনটি কেবল print a,z


86 বাইট

from random import*
a,b,c=map(gauss,[0]*3,[1]*3)
R=(a*a+b*b+c*c)**.5
print a/R,b/R,c/R

এটি অনলাইন চেষ্টা করুন!

তিনটি নরমাল উত্পন্ন করে ফলাফলটি স্কেল করে।


পাইপথন 2 নাম্বার সহ, 57 বাইট

from numpy import*
a=random.randn(3)
print a/sum(a*a)**.5

এটি অনলাইন চেষ্টা করুন!

sum(a*a)**.5তুলনায় খাটো linalg.norm(a)। আমরা dot(a,a)হিসাবে একই দৈর্ঘ্যের জন্য করতে পারে sum(a*a)। পাইথন 3 এ, a@aনতুন অপারেটরটি ব্যবহার করে এটি ছোট করা যেতে পারে @


1
আমি আপনার প্রথম পদ্ধতির পছন্দ। zঅভিন্ন ডিস্ট্রিবিউশন থেকে অকেজো করা না রেখে যদি নিরক্ষীয় অঞ্চলের দিকে পক্ষপাত কীভাবে এড়ানো যায় তা বুঝতে আমার সমস্যা হচ্ছে ।
জিতসে

2
@ জিটস প্রতিটি স্থানাঙ্কের তুলনায় গোলকের বন্টন ফ্যাক্টর ইউনিফর্মের মধ্যে রয়েছে। এটি মাত্রা ৩ এর জন্য বিশেষ কিছু instance উদাহরণস্বরূপ দেখুন এই প্রমাণটি দেখুন যে কোনও গোলকের একটি স্লাইসের পৃষ্ঠের ক্ষেত্রফলটি তার উচ্চতার সাথে সমানুপাতিক। এই নিরক্ষীয় অঞ্চলে পক্ষপাতদুষ্ট অন্তর্নিহিততা সম্পর্কে, দ্রষ্টব্য যে নিরক্ষীয় অঞ্চলের কাছাকাছি টুকরা বৃহত্তর ব্যাসার্ধের সাথে থাকে, খুঁটির নিকটে থাকা অংশগুলির ভিতরের দিকে আরও শিরোনাম থাকে যা আরও বেশি অঞ্চল দেয় এবং এটি এই দুটি প্রভাবকে একেবারে বাতিল হিসাবে সরিয়ে দেয়।
এক্সএনওর

খুব সুন্দর! স্পষ্টতা এবং রেফারেন্সের জন্য ধন্যবাদ।
জিতসে

@ জিটস ধন্যবাদ, আমি এটি শরীরে যুক্ত করেছি। আমি বুঝতে পেরেছিলাম যে আমি কেবল ইতিবাচক নমুনা দিচ্ছি zযদিও, এবং এটি কয়েক বাইটের জন্য স্থির করেছিলাম ।
এক্সএনআর

1
@ জিটস প্রকৃতপক্ষে, একটি গোলকের পৃষ্ঠের ক্ষেত্রফল ঘের সিলিন্ডারের পাশের পৃষ্ঠের সমান!
নীল

13

অক্টাভা , 40 33 22 বাইট

আমরা নমুনা একটি 3 ডি স্ট্যান্ডার্ড সাধারণ বিতরণ এবং ভেক্টর স্বাভাবিককরণ:

(x=randn(1,3))/norm(x)

এটি অনলাইন চেষ্টা করুন!


অক্টেভ শুধুমাত্র (অর্থাত না ম্যাটল্যাব) জন্য, আপনার সাথে একটি বাইট সংরক্ষণ করতে পারবেন এই
টম ছুতার

1
@ টমকার্পেন্টার ধন্যবাদ! এই ক্ষেত্রে এটি কেবলমাত্র একটি অভিব্যক্তি হিসাবে আমরা এমনকি disp:) বাদ দিতে পারি
flawr

10

ইউনিটি সি # , 34 বাইট

f=>UnityEngine.Random.onUnitSphere

ইউনিট গোলকের এলোমেলো মানগুলির জন্য ইউনিটির একটি অন্তর্নির্মিত বৈশিষ্ট্য রয়েছে, তাই আমি ভেবেছিলাম আমি এটি পোস্ট করব।


+1 এ অন্তর্নির্মিত ব্যবহারের ভাল ব্যবহার, আপনি কিছুটা খাটো হওয়ার জন্য একটি ফাংশন স্রেফ জমা দিতে পারবেনf=>Random.onUnitSphere
লিফডওয়েভিন

@ লিফডেও আমি ল্যাম্বডাস সম্পর্কে জানতাম, তবে আমি ঠিক নিশ্চিত ছিলাম না যে এটি যথেষ্ট (কোড গল্ফের বৈধতার শর্তে) যথেষ্ট কারণ এটি এর ধরণের ঘোষণা দেয় না f; varশুধুমাত্র একটি পদ্ধতির অভ্যন্তরে কাজ করে এবং System.Func<Vector3>এটি দীর্ঘ ছিল।
ড্রাকো 18

1
কোডগল্ফে কোনও ফাংশন ফিরিয়ে দেওয়া পুরোপুরি ভাল, এবং আপনাকে ঘোষণার গণনা করতে হবে না হয় অর্থ হয় আপনি গতিশীল পরামিতিগুলির সাথে স্নিগ্ধ জিনিস করতে পারেন। আপনি সর্বশেষ আধা-কোলনও গণনা করেন না। তবে আপনি যুক্ত সমস্ত বিবৃতি ব্যবহার করে গণনা করুন। সুতরাং আপনার বাইট গণনা ব্যবহার অন্তর্ভুক্ত করা প্রয়োজন। তবে f=>Random.onUnitSphereএটি পুরোপুরি বৈধ জমা
লিফডে ওয়েইন

@ লিফডওয়েইন হ্যাঁ, আমি ঠিক নিশ্চিত ছিলাম না যে কীভাবে এই ঘোষণাপত্রটি হ্যান্ডেল করা হয়েছে এবং "অনুসন্ধানের মেটা" পর্যন্ত সত্যই অনুভব করা হয়নি।
ড্রাকো 18

f=>UnityEngine.Random.onUnitSphereআপনাকে বাঁচায়using
ওরেস


6

রুবি , 34 50 49 বাইট

->{[z=rand*2-1]+((1-z*z)**0.5*1i**(rand*4)).rect}

এটি অনলাইন চেষ্টা করুন!

3 টি সংখ্যার অ্যারে প্রদান করে [z,y,x]

xএবং 0 এবং 4 এর মধ্যে একটি এলোমেলো শক্তিতে (-1 এর বর্গমূল) yউত্থাপন দ্বারা উত্পন্ন হয় iএই জটিল সংখ্যাটি zপাইথাগোরাস উপপাদ্য অনুসারে মান অনুসারে যথাযথভাবে স্কেল করা দরকার :(x**2 + y**2) + z**2 = 1.

zতুল্য (যা প্রথম উৎপন্ন হয়) কেবল মধ্যবর্তী -1 এবং 1 যদিও না অবিলম্বে সুস্পষ্ট, Da / একটি গোলক মাধ্যমে একটি ফালি জন্য Dz ধ্রুবক একটি অবিশেষে বিতরণ সংখ্যা (এবং একই ব্যাসার্ধ একটি বৃত্তের ঘের করার সমান পুরো গোলক।)।

এটি স্পষ্টতই আর্কিমিডিস আবিষ্কার করেছিলেন যিনি একে একে একে খুব অ-ক্যালকুলাসের মতো বর্ণনা করেছিলেন এবং এটি আর্কিমিডিস হাট-বক্স উপপাদ্য হিসাবে পরিচিত। দেখHttps://brilliant.org/wiki/surface-area-sphere/

Xnor এর উত্তর সম্পর্কে মন্তব্য থেকে অন্য একটি রেফারেন্স। একটি আশ্চর্যজনকভাবে সংক্ষিপ্ত ইউআরএল, একটি আশ্চর্যজনকভাবে সরল সূত্রটি বর্ণনা করে: http://mathworld.wolfram.com/Zone.html


@ জিটস আমি জেড এর উচ্চ মানগুলিতে x এবং y স্কেল করতে ভুলে গিয়েছি। কার্যকরভাবে পয়েন্টগুলি একটি সিলিন্ডারকে সংজ্ঞায়িত করে। এটি এখনই ঠিক করা হয়েছে তবে এটির ব্যয় অনেক বেশি! কোনও জটিল সংখ্যা দিয়ে যদি আউটপুট প্রকাশ করা যায় তবে আমি কয়েকটিকে বাঁচাতে পারতাম যদি [z, x+yi]না আপনি না বলে থাকেন তবে আমি এটি এটি ছেড়ে দেব।
স্তর নদী

ভাল লাগছে! আমি সত্যিই এই পদ্ধতির পছন্দ। ধারাবাহিকতার জন্য, প্রয়োজনীয় আউটপুটটি তিনটি ভাসমান, তাই আমি এটি এটিকে রেখে দেওয়ার পরামর্শ দিই।
জিতসে

z*zপরিবর্তে ব্যবহার করবেন না কেন z**2?
মান কালি

@ ভালিউইঙ্ক হ্যাঁ ধন্যবাদ আমি বুঝতে পেরেছি যে আমি এটি মিস করেছি z*z। আমি এখনই এটি সম্পাদনা করেছি। অন্য যে জিনিসটি আমি করতে পারি তা হ'ল rand*4এমন কিছু z*99বা x*9E9(কার্যকরভাবে সম্ভাব্য মানগুলিকে গোলকের খুব সূক্ষ্ম সর্পিলিতে সীমাবদ্ধ করা) এর সাথে প্রতিস্থাপন করা তবে আমি মনে করি যে এলোমেলো মানের গুণমান হ্রাস করে।
স্তরের নদী

4

05 এ বি 1 ই , 23 22 বাইট

[тε5°x<Ýs/<Ω}DnOtDî#}/

২ য় অ্যালগরিদম কার্যকর করে।

এটি অনলাইনে চেষ্টা করুন বা আরও কয়েকটি এলোমেলো আউটপুট পান

ব্যাখ্যা:

[0,1)0,000010,00000000159

[            # Start an infinite loop:
 тε          #  Push 100, and map (basically, create a list with 3 values):
   5°        #   Push 100,000 (10**5)
     x       #   Double it to 200,000 (without popping)
      <      #   Decrease it by 1 to 199,999
       Ý     #   Create a list in the range [0, 199,999]
        s/   #   Swap to get 100,000 again, and divide each value in the list by this
          <  #   And then decrease by 1 to change the range [0,2) to [-1,1)
           Ω #   And pop and push a random value from this list
  }          #  After the map, we have our three random values
   D         #   Duplicate this list
    n        #   Square each inner value
     O       #   Take the sum of these squares
      t      #   Take the square-root of that
       D     #   Duplicate that as well
        î    #   Ceil it, and if it's now exactly 1:
         #   #    Stop the infinite loop
}/           # After the infinite loop: normalize by dividing
             # (after which the result is output implicitly)

1
ব্যবহার <1 সমান হিসাবে বৈধ 1। এর একমাত্র মানদণ্ডএক্স তাই কি 0<এক্স1। আপনি ঠিক সেই সাথে ভেক্টর গ্রহণ করতে পারেন<0.5যদি এটি কোনও বাইট সংরক্ষণ করে। এর চেয়ে ছোট বা সমান কোনও মান1 পক্ষপাত দূর করে।
জিতসে

@ জিটস ওকে, আমার জাভা এবং 05 এবি 1 ই উত্তর উভয়টিতেই নরমালাইজেশন প্রয়োগ করেছে। আমি আশা করি সবকিছু এখন ঠিক আছে।
কেভিন ক্রুইজসেন

@ জিটস আসলে চেক করে একটি বাইট সংরক্ষণ করেছে বনাম1 যেমন বনাম==1, পরিবর্তে বনাম<1। তবে কেবল এই স্পষ্টতার জন্য ধন্যবাদ0<এক্স1 এটি একটি প্রয়োজনীয়তা, এবং কোনও কঠোর নেই প্রয়োজনীয়তা , যতক্ষণ না এটি 1
কেভিন ক্রুইজসেন

4

টিআই-বেসিক, 15 বাইট *

:randNorm(0,1,3
:Ans/√(sum(Ans²

অ্যালগরিদম ব্যবহার করে "3 সাধারণভাবে বিতরণকৃত মান উত্পন্ন করে এবং সেই ভেক্টরটিকে স্বাভাবিককরণ"।

একটি এক্সপ্রেশন দিয়ে একটি প্রোগ্রাম শেষ করার পরে প্রোগ্রামটি শেষ হওয়ার পরে হোমস্ক্রিনে স্বয়ংক্রিয়ভাবে ফলাফল মুদ্রণ করে, ফলস্বরূপ ফলাফলটি কেবল উত্পন্ন এবং ব্ল্যাকহোল্ড নয়, প্রদর্শিত হয়।

*: randNorm(একটি দ্বি-বাইট টোকেন , বাকিগুলি এক বাইট টোকেন । আমি প্রাথমিক (অপরিবর্তনীয়) গণনা করেছি :, এটি ছাড়াই এটি 14 বাইট হবে। এক-অক্ষরের নাম সহ একটি প্রোগ্রাম হিসাবে সংরক্ষণ করা, এটি 24 বাইট মেমরি লাগে, যার মধ্যে 9-বাইট ফাইল-সিস্টেমের ওভারহেড অন্তর্ভুক্ত থাকে।


3

জাভাস্ক্রিপ্ট (ES7),  77 76  75 বাইট

ব্যবহার করে 3 তম এলগোরিদম কার্যকর করেপাপ(φ)=পাপ(কোসাইন্-1(z- র))=1-z- র2

with(Math)f=_=>[z=2*(r=random)()-1,cos(t=2*PI*r(q=(1-z*z)**.5))*q,sin(t)*q]

এটি অনলাইন চেষ্টা করুন!

মন্তব্য

with(Math)                       // use Math
f = _ =>                         //
  [ z = 2 * (r = random)() - 1,  // z = 2 * j - 1
    cos(                         //
      t =                        // θ =
        2 * PI *                 //   2 * π * i
        r(q = (1 - z * z) ** .5) // q = sin(ɸ) = sin(arccos(z)) = √(1 - z²)
                                 // NB: it is safe to compute q here because
                                 //     Math.random ignores its parameter(s)
    ) * q,                       // x = cos(θ) * sin(ɸ)
    sin(t) * q                   // y = sin(θ) * sin(ɸ)
  ]                              //

জাভাস্ক্রিপ্ট (ES6), 79 বাইট

2 এনডি অ্যালগরিদম কার্যকর করে।

f=_=>(n=Math.hypot(...v=[0,0,0].map(_=>Math.random()*2-1)))>1?f():v.map(x=>x/n)

এটি অনলাইন চেষ্টা করুন!

মন্তব্য

f = _ =>                         // f is a recursive function taking no parameter
  ( n = Math.hypot(...           // n is the Euclidean norm of
      v =                        // the vector v consisting of:
        [0, 0, 0].map(_ =>       //
          Math.random() * 2 - 1  //   3 uniform random values in [-1, 1]
        )                        //
  )) > 1 ?                       // if n is greater than 1:
    f()                          //   try again until it's not
  :                              // else:
    v.map(x => x / n)            //   return the normalized vector

3

প্রক্রিয়াজাতকরণ 26 বাইট

পুরো প্রোগ্রাম

print(PVector.random3D());

এটি বাস্তবায়ন https://github.com/processing/processing/blob/master/core/src/processing/core/PVector.java

  static public PVector random3D(PVector target, PApplet parent) {
    float angle;
    float vz;
    if (parent == null) {
      angle = (float) (Math.random()*Math.PI*2);
      vz    = (float) (Math.random()*2-1);
    } else {
      angle = parent.random(PConstants.TWO_PI);
      vz    = parent.random(-1,1);
    }
    float vx = (float) (Math.sqrt(1-vz*vz)*Math.cos(angle));
    float vy = (float) (Math.sqrt(1-vz*vz)*Math.sin(angle));
    if (target == null) {
      target = new PVector(vx, vy, vz);
      //target.normalize(); // Should be unnecessary
    } else {
      target.set(vx,vy,vz);
    }
    return target;
  }

2
আপনি এটিকে আরও পরিষ্কার করতে চাইতে পারেন যে বাস্তবায়নটি আপনার বাইট গণনার অংশ নয়। আমি প্রথম পড়ার সময় এটিকে মিস করেছি, তারপরে একটি ডাবল-গ্রহণ করেছি।
স্তরের নদী

আমি পছন্দ করি যে বাস্তবায়ন আমার মতো মূলত একই পদ্ধতির ব্যবহার করে
স্তরের নদী

2

পাইথন 2 , 86 বাইট

from random import*
x,y,z=map(gauss,[0]*3,[1]*3);l=(x*x+y*y+z*z)**.5
print x/l,y/l,z/l

এটি অনলাইন চেষ্টা করুন!

প্রথম অ্যালগরিদম কার্যকর করে।


পাইথন 2 , 107 103 বাইট

from random import*
l=2
while l>1:x,y,z=map(uniform,[-1]*3,[1]*3);l=(x*x+y*y+z*z)**.5
print x/l,y/l,z/l

এটি অনলাইন চেষ্টা করুন!

দ্বিতীয় অ্যালগরিদম কার্যকর করে।


2
@ রবিনরাইডার এই প্রয়োগটি প্রাথমিক দৈর্ঘ্য> 1 সহ ভেক্টরকে প্রত্যাখ্যান করে, যা চ্যালেঞ্জটিতে নির্দিষ্ট হিসাবে কার্যকর।
জিতসে

@ জিটস ঠিক আছে, দুঃখিত। আমি কোডটি ভুল লিখেছি।
রবিন রাইডার

2

হাস্কেল , 125 123 119 118 বাইট

import System.Random
f=mapM(\_->randomRIO(-1,1))"lol">>= \a->last$f:[pure$(/n)<$>a|n<-[sqrt.sum$map(^2)a::Double],n<1]

এটি অনলাইন চেষ্টা করুন!

তিনটি ইউনিফর্মটি এলোমেলোভাবে এবং প্রত্যাখ্যানের নমুনা দেয়।


দেখে মনে হচ্ছে আপনার র্যান্ডমগুলি (-1,1) এর পরিবর্তে বিতরণ (0,1) থেকে এসেছে, যাতে গোলকের কেবল 1/8 অংশই .াকা থাকে।
জিতসে

@ জিতসে গোছা, লক্ষ্য করার জন্য ধন্যবাদ
অ্যাঙ্গেলস

2

জাভাস্ক্রিপ্ট, 95 বাইট

f=(a=[x,y,z]=[0,0,0].map(e=>Math.random()*2-1))=>(s=Math.sqrt(x*x+y*y+z*z))>1?f():a.map(e=>e/s)

আপনি না প্রয়োজন না ইনপুটে a


বাহ, আমি এটি পুরোপুরি মিস করেছি। সংশোধন করা হয়েছে।
নারুয়োকো

2

জুলিয়া 1.0 , 24 বাইট

x=randn(3)
x/hypot(x...)

এটি অনলাইন চেষ্টা করুন!

3 টি মানের ভেক্টর আঁকুন, 0 এর কাছাকাছি একটি সাধারণ বিতরণ থেকে স্ট্যান্ডার্ড বিচ্যুতি 1 দিয়ে আঁকুন Then তারপরে কেবল তাদের সাধারণ করুন।


randn()কয়েকটি দ্রুত পরীক্ষা থেকে, প্রয়োজনীয় ব্যাপ্তির সাথে আবদ্ধ বলে মনে হয় না। এছাড়াও, hypot()এটিতে কোনও মান ফেরত দেওয়ার জন্য কোনও চেক অন্তর্ভুক্ত নয় >1, যা প্রত্যাখ্যান করা উচিত।
শেগি

3
@ শেগি এটি randnইউনিফর্ম (0,1) একের চেয়ে মানক সাধারণ বিতরণে অনুকরণ করবে , সুতরাং এই পদ্ধতিটি আর এর মতো ical
জিউসেপে

@ জিউসেপ হ্যাঁ, ঠিক!
ব্যবহারকারী 3263164

@ জিউসেপ, আমি মনে করি যে এই চ্যালেঞ্জের পিছনে গণিত সম্পর্কে আমার যথাযথ উপলব্ধি নাও হতে পারে তবে, আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি বলছেন যে কোনও ভাসমান যদি সীমানার বাইরে থাকে তবে [-1,1)তাদের দ্বারা বিভাজনকারী অনুমান, যা হবে >1, অফসেট? এটি আমার বিস্ময়ের দিকে নিয়ে যায় যে আমার সমাধানের ত্রৈমাসিকটি প্রয়োজনীয় কিনা ...
শেগি

@ শেগি নং, সাধারণ / গাউসীয় বিতরণে কিছু বৈশিষ্ট্য রয়েছে (বিশেষত, ঘূর্ণমান আক্রমণ) যা ইউনিফর্মটির নেই, এই মন্তব্যটি দেখুন , উদাহরণস্বরূপ
জিউসেপে

2

ম্যাথগল্ফ , 21 19 18 বাইট

{╘3Ƀ∞(ß_²Σ√_1>}▲/

২ য় অ্যালগরিদমের প্রয়োগ।

এটি অনলাইনে চেষ্টা করুন বা একই সাথে আরও কয়েকটি আউটপুট দেখুন

ব্যাখ্যা:

{              }▲   # Do-while true by popping the value:
                   #  Discard everything on the stack to clean up previous iterations
  3É                #  Loop 3 times, executing the following three operations:
    ƒ               #   Push a random value in the range [0,1]
                   #   Double it to make the range [0,2]
      (             #   Decrease it by 1 to make the range [-1,1]
       ß            #  Wrap these three values into a list
        _           #  Duplicate the list of random values
         ²          #  Square each value in the list
          Σ         #  Sum them
                   #  And take the square-root of that
            _       #  Duplicate it as well
             1>     #  And check if it's larger than 1
                 /  # After the do-while, divide to normalize
                    # (after which the entire stack joined together is output implicitly,
                    #  which is why we need the `╘` to cleanup after every iteration)

2

জাভা 8 ( @ আরনাউল্ডের পরিবর্তিত তৃতীয় অ্যালগরিদম), 131 126 119 111 109 বাইট

v->{double k=2*M.random()-1,t=M.sqrt(1-k*k),r[]={k,M.cos(k=2*M.PI*M.random())*t,M.sin(k)*t};return r;}

@ আর্নল্ডের জাভাস্ক্রিপ্টের উত্তরটির পোর্ট , সুতরাং তাকে উর্ধ্বমুখী করা নিশ্চিত করুন!
-২ বাইট @ অলিভিগ্রগ্রোয়ারকে ধন্যবাদ ।

এটি হিসাবে প্রয়োগ করা হয়:

=এন[-1,1)
টি=1-2
তোমার দর্শন লগ করা=2π×(এন[0,1))
এক্স,Y,z- র={,কোসাইন্(তোমার দর্শন লগ করা)×টি,পাপ(তোমার দর্শন লগ করা)×টি}

এটি অনলাইনে চেষ্টা করুন।

পূর্ববর্তী তৃতীয় অ্যালগরিদম বাস্তবায়ন ( 131 126 119 বাইট):

Math M;v->{double k=2*M.random()-1,t=2*M.PI*M.random();return k+","+M.cos(t)*M.sin(k=M.acos(k))+","+M.sin(t)*M.sin(k);}

হিসাবে প্রয়োগ করা:

=এন[-1,1)
টি=2π×(এন[0,1))
এক্স,Y,z- র={,কোসাইন্(টি)×পাপ(arccos()),পাপ(টি)×পাপ(arccos())}

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

Math M;                         // Math on class-level to use for static calls to save bytes
v->{                            // Method with empty unused parameter & double-array return
  double k=2*M.random()-1,      //  Get a random value in the range [-1,1)
         t=M.sqrt(1-k*k),       //  Calculate the square-root of 1-k^2
    r[]={                       //  Create the result-array, containing:
         k,                     //   X: the random value `k`
         M.cos(k=2*M.PI         //   Y: first change `k` to TAU (2*PI)
                     *M.random()//       multiplied by a random [0,1) value
                )               //      Take the cosine of that
                 *t,            //      and multiply it by `t`
         M.sin(k)               //   Z: Also take the sine of the new `k` (TAU * random)
                  *t};          //      And multiply it by `t` as well
  return r;}                    //  Return this array as result

জাভা 8 (দ্বিতীয় অ্যালগরিদম), 153 143 বাইট

v->{double x=2,y=2,z=2,l;for(;(l=Math.sqrt(x*x+y*y+z*z))>1;y=m(),z=m())x=m();return x/l+","+y/l+","+z/l;};double m(){return Math.random()*2-1;}

এটি অনলাইনে চেষ্টা করুন।

২ য় অ্যালগরিদম:

v->{                              // Method with empty unused parameter & String return-type
  double x=2,y=2,z=2,l;           //  Start results a,b,c all at 2
  for(;(l=Math.sqrt(x*x+y*y+z*z)) //  Loop as long as the hypotenuse of x,y,z
       >1;                        //  is larger than 1
    y=m(),z=m())x=m();            //   Calculate a new x, y, and z
  return x/l+","+y/l+","+z/l;}    //  And return the normalized x,y,z as result
double m(){                       // Separated method to reduce bytes, which will:
  return Math.random()*2-1;}      //  Return a random value in the range [-1,1)

জেএসের sqrt(1-k*k)চেয়ে জাভাতে বেশি বাইট সংরক্ষণ করা আসলে ব্যবহার করা Using :)
আর্নল্ড

@ আর্নল্ড ইয়েপ 3x M.sin, 1x M.cosএবং 1x এর পরিবর্তে M.acos, আপনার পদ্ধতির 2x M.sinএবং 1x ব্যবহার করা M.sqrtহয় যা অতিরিক্ত সংরক্ষিত বাইটগুলি বেশিরভাগ থেকে আসে। :)
কেভিন ক্রুইজসেন

108 বাইটস একটি পরিবর্তিত ২ য় অ্যালগরিদম ব্যবহার করে যেখানে আমি কেবলমাত্র মানগুলিকেই অনুমতি দেব যেখানে s == 1 (s <= 1 এর পরিবর্তে এবং তারপরে সাধারণীকরণের জন্য)। এটি কখনও কখনও একটি উত্তর দেয় তবে বেশিরভাগ সময়সীমা শেষ হওয়ার কারণে হয় না। সম্পাদনা: ওফস, আমি ম্যাথ.স্কয়ারটি ভুলে গেছি ফলাফল
অলিভিয়ার গ্রাগোয়ার

আসলে, না, স্কয়ার্ট করার দরকার নেই কারণ স্কয়ার্ট (1) == 1। সুতরাং আমি আমার গল্ফ পরামর্শ সঙ্গে দাঁড়িয়ে।
অলিভিয়ার গ্রাগোয়ার

1
109 বাইট ( double[]বাইট-কাউন্ট পরিবর্তন করে না এমন পরিবর্তে আপনি আপনার স্ট্রিং আউটপুট ব্যবহার করতে পারেন ))
অলিভিয়ার গ্রাগোয়ার

1

জাপট , 20 বাইট

পোর্ট অফ আর্নৌল্ডের ২ য় অ্যালগরিদম বাস্তবায়ন

MhV=3ÆMrJ1
>1?ß:V®/U

এটা পরীক্ষা করো

MhV=3ÆMrJ1
Mh             :Get the hypotenuse of
  V=           :  Assign to V
    3Æ         :  Map the range [0,3)
      Mr       :    Random float
        J1     :    In range [-1,1)
>1?ß:V®/U      :Assign result to U
>1?            :If U is greater than 1
   ß           :  Run the programme again
    :V®/U      :Else map V, dividing all elements by U


1

ওক্যামেল , 110 99 95 বাইট

(fun f a c s->let t,p=f 4.*.a 0.,a(f 2.-.1.)in[c t*.s p;s t*.s p;c p])Random.float acos cos sin

সম্পাদনা: ইনলাইন করে কিছু বাইট বন্ধ করে দেওয়া আমি এবং , প্রথমটির let ... inসাথে ক এর সাথে প্রতিস্থাপন করা funএবং কিছু প্যারেনগুলি এড়াতে অপারেটর এসোসিয়েটিভিটির সুবিধা নেওয়া ()

এটি অনলাইনে চেষ্টা করুন


আসল সমাধান:

Random.(let a,c,s,i,j=acos,cos,sin,float 4.,float 2. in let t,p=i*.(a 0.),a (j-.1.) in[c t*.s p;s t*.s p;c p])

প্রথম আমি সংজ্ঞায়িত:

একটি=arccos,  =কোসাইন্,  গুলি=পাপআমি~unif(0,4),  ~unif(0,2)

ওসিএএমএল এর Random.floatকার্যক্ষেত্রে সীমাবদ্ধতা রয়েছে। তারপর,

টি=আমিএকটি(0)=আমিπ2,  পি=একটি(-1)

এটি 3 য় উদাহরণ বাস্তবায়নের সাথে খুব মিল (একই সাথে) φ=পি এবং θ=টি) - বাদে আমি বাছাই আমি এবং বৃহত্তর বিরতিতে গুনটি এড়াতে (২ সহ) পরবর্তীতে।


1
আমি এই ভাষার সাথে তেমন পরিচিত নই তবে মনে হচ্ছে আপনি এলোমেলোভাবে ভাসমান ভাসমান কাঠের মধ্যে 0এবং 1সরাসরি গোলাকার স্থানাঙ্ক হিসাবে ব্যবহার করেন । 3 এবং 4 চ্যালেঞ্জের মন্তব্যগুলিতে যেমনটি দেখানো হয়েছে ততই এটি ভুল, যেহেতু আপনি গোলকের খুঁটির দিকে পক্ষপাতিত্ব অবলম্বন করেন। আপনি মন্তব্য 4 এ প্রদর্শিত পদ্ধতি প্রয়োগ করে এটি সংশোধন করতে পারেন।
জিতসে

ধন্যবাদ! সম্পূর্ণরূপে যে মিস। বাগ স্থির করে আমার উত্তর আপডেট করেছে
সাসওয়ত পাধি

1
ভাল লাগছে! খুব সুন্দর প্রথম উত্তর!
জিতসে

আপনাকে ধন্যবাদ :) আমি এটি কম -100 বাইটে হ্রাস করতে সক্ষম হয়েছি!
সাসওয়ত পাধি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.