lambdaway
::
middle_square
7
|
list
|
login
|
load
|
|
_h1 middle square method _p Following [[https://rosettacode.org|https://rosettacode.org/wiki/Pseudo-random_numbers/Middle-square_method]], « to generate a sequence of n-digit pseudo-random numbers, an n-digit starting value is created and squared, producing a 2n-digit number. If the result has fewer than 2n digits, leading zeroes are added to compensate. The middle n digits of the result would be the next number in the sequence and returned as the result. This process is then repeated to generate more numbers. » _p For instance: {pre '{* 675248 675248} -> {* 675248 675248} -> floor( 455959861504 / 1000 ) // del 3 lasts -> 455959861 % 1000000 // del 3 firsts -> 959861 '{* 959861 959861} -> {* 959861 959861} -> 921(333139)321 and so on... } _h2 1) using C {prewrap long long seed; long long random() '{ seed = seed * seed / 1000 % 1000000; return seed; } int main() '{ seed = 675248; for(int i=1;i<=5;i++) printf("%lld\n",random()); return 0; } Output: 959861 333139 981593 524817 432883 } _h2 2) using lambdatalk {prewrap '{def W.fill {lambda {:v :n} {if {<= :n 0} then else :v{W.fill :v {- :n 1}}}}} -> {def W.fill {lambda {:v :n} {if {<= :n 0} then else :v{W.fill :v {- :n 1}}}}} '{def W.pad {lambda {:n :size} {if {<= {W.length :n} :size} then :n{W.fill :size {- :size {W.length :n}}} else {W.slice 0 {- :size {W.length :n}} :n}}}} -> {def W.pad {lambda {:n :size} {if {<= {W.length :n} :size} then :n{W.fill :size {- :size {W.length :n}}} else {W.slice 0 {- :size {W.length :n}} :n}}}} '{def randoms {lambda {:s :n} {if {>= :n 0} then :s {randoms {W.pad {% {floor {/ {* :s :s} 1.e3}} 1.e6} 6} {- :n 1}} else}}} -> {def randoms {lambda {:s :n} {if {>= :n 0} then :s {randoms {W.pad {% {floor {/ {* :s :s} 1.e3}} 1.e6} 6} {- :n 1}} else}}} '{randoms 959861 4} -> {randoms 959861 4} '{randoms 675248 4} -> {randoms 675248 4} 675248 '{* 675248 675248} -> {* 675248 675248} 959861 '{* 959861 959861} -> {* 959861 959861} 333139 '{* 333139 333139} -> {* 333139 333139} 981593 '{* 981593 981593} -> {* 981593 981593} 524817 ... '{randoms 675248 300} -> {randoms 675248 300} 713789 '{* 713789 713789} -> {* 713789 713789} = 509[494736]521 } _p {i alain marty | 2023/01/12}
lambdaway v.20211111