자바 8 ( @Arnauld 의 변형 알고리즘 3) 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;}
@Arnauld 의 JavaScript 답변 포트이므로 그를 투표 하십시오! @ OlivierGrégoire
덕분에 -2 바이트 .
이것은 다음과 같이 구현됩니다.
k = N∩ [ − 1 , 1 )
t = 1 − k2−−−−−√
U = 2 π× ( N∩ [ 0 , 1 ) )
x , y, z= { k , cos( u ) × t , 죄( u ) × t }
온라인으로 사용해보십시오.
이전 3 알고리즘의 구현 ( 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);}
다음과 같이 구현됩니다.
k = N∩ [ − 1 , 1 )
t = 2 π× ( N∩ [ 0 , 1 ) )
x , y, z= { k , cos( t ) × 죄( 아르 코스( k ) ) , 죄( t ) × 죄( 아르 코스( k ) ) }
온라인으로 사용해보십시오.
설명:
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
Java 8 (2 차 알고리즘), 153143 바이트
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)