Wolfram 언어, RandomChoice 재귀
-
20-12-2019 - |
문제
a = RandomChoice[{a,2}]&
a[]
이 예제를 달성하는 다른 방법이 있지만 이 방법을 사용하여 이와 유사한 더 복잡한 작업을 수행하고 싶습니다.
더 이상 없을 때까지 이 작업을 계속할 수 있나요? a
해결을 시도하여 스택 오버플로를 생성하지 않고 해결해야 할 시간이 남았습니다. {a,2}
선택하기 전에?대신 선택을 하고 선택한 기호만 해결합니다.
해결책
여기에 방법이 있습니다 RandomChoice
선택한 경우에만 함수를 평가합니다.
g := (Print["evaluate g"]; 42);
f = ( If[TrueQ[#], g, #] &@RandomChoice[{True, 1, 2, 3, 4}]) &
Table[f[], {10}]
이것은 무작위로 선택된 경우에만 "evaluate g"를 인쇄하고 예를 들어 출력합니다.
(* {2, 42, 3, 1, 3, 2, 4, 42, 2, 4} *)
이것은 또 다른 방법입니다. 어쩌면 좀 더 깔끔할 수도 있습니다.
f = Unevaluated[{g, 1, 2, 3, 4}][[RandomInteger[{1, 5}]]] &
이것은 재귀적으로 잘 작동합니다.
a = Unevaluated[{a[], 2}][[RandomInteger[{1, 2}]]] &
내가 댓글에서 말했듯이 2가 선택될 때까지 반복되므로 매번 2를 반환합니다.
a[] (* 2 *)
나는 질문 전체를 이해하지 못하며 원하는 것을 달성하는 더 좋은 방법이 있다고 생각합니다.
다른 팁
귀하의 요청이 약간 모순되는 것 같습니다.무작위로 선택했을 때 a
당신은 그것이 반복되기를 원하지만 숫자를 선택하면 더 이상 숫자가 없을 때까지 계속하고 싶습니다. a
남았습니다.
다음 코드는 이를 수행하지만 재귀는 기술적으로 불필요합니다.아마도 귀하의 응용 프로그램에 적용될 수 있습니다.
첫 번째 부분에서는 선택을 반복하는 방법을 보여줍니다. a
사용하여 Hold
:-
Clear[a]
list = {1, 2, a, 1, a, 3, a, 1, 4, 5};
heldlist = Hold /@ list;
a := Module[{z}, z = RandomChoice[heldlist];
Print["for information, choice was ", z];
If[MatchQ[z, Hold[_Symbol]],
heldlist = DeleteCases[heldlist, z, 1, 1];
If[MemberQ[heldlist, Hold[_Symbol]], ReleaseHold[z]]]]
a
이번 기회에 전화해서 a
한 번 반복한 다음 예상대로 4를 선택하고 중지합니다.
정보를 위해 선택은 Hold[a]였습니다.
정보를 위해 선택은 보류였습니다.[4]
더 이상 없을 때까지 프로세스를 계속하려면 a
'에스 While
사용할 수 있습니다.여기서도 재귀가 발생하지만 While
숫자가 선택되면 프로세스가 계속 진행됩니다.
While[MemberQ[heldlist, Hold[_Symbol]], a]
정보를 위해 선택은 Hold[a]였습니다.
정보를 보려면 보류를 선택했습니다.[1]
정보를 위해 선택은 Hold[a]였습니다.
목록의 나머지 항목은 다음과 같습니다.
ReleaseHold /@ heldlist
{1, 2, 1, 3, 1, 4, 5}