Vocabulary/query

From J Wiki
Jump to navigation Jump to search

>> <<   Down to: Dyad   Back to: Vocabulary Thru to: Dictionary

? y Roll

Rank 0 -- operates on individual atoms of y, producing a result of the same shape -- WHY IS THIS IMPORTANT?


Generates a random number uniformly distributed in a range determined by integer y.

y range of random number
0 floating-point value in interval (0,1)
1 0 (always)
2 Boolean
>1 integer or extended integer from list i.y
   ? 0     NB. result will be 0 to 1
0.242499
   ? 0
0.80461
   ? 100   NB. result will be 0 to 99
30
   ? 100
86
   ? 10 # 100
91 93 17 97 58 51 16 75 42 40

Common uses

1. Make a random boolean matrix

   ? 5 5 $ 2
1 0 1 0 0
0 1 1 0 1
0 1 0 0 1
1 0 1 1 1
0 1 1 1 0

2. Toss a biased coin 10 times (1=Heads / 10% chance, 0=Tails / 90% chance)

   0.1 > ?20#0
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0

3. Pick a letter at random

(?26) { 'abcdefghijklmnopqrstuvwxyz'
f

Related Primitives

Roll (Fixed seed) (?. y)


Details

1. J offers a choice of random-number generator (RNG):

Code RNG Name Time
1 GB_Flip 1
2 Mersenne Twister (default) 1
3 DX-1597-4d 3
4 MRG32k3a 8
0 combination of all

the above RNGs

12

The Time column above specifies a relative time penalty for each RNG: higher is slower.

Select the RNG with 9!:43 n where n comes from the table above, or use 9!:42 '' to see which RNG is selected.

2. The sequence of random numbers depends on the state of the RNGs. This state, which includes the choice of RNG to use, can be read by

RNGstate =: 9!:44 ''

and restored by 9!:45 RNGstate. The state is a list of boxes whose format should not be disturbed.

3. The state of the RNG can be reset by

9!:1 initvalue

where initvalue is an integer atom (or, for the Mersenne Twister generator only, an integer list) that selects a starting state. Resetting to a given initvalue always returns the RNG to the same initial state. Phrase 9!:0 '' will return the most recently used initvalue.

For RNGs 3 and 4, initvalue must not be 0.


Use These Combinations

Combinations using  ? y that have exceptionally good performance include:

What it does Type;

Precisions;
Ranks

Syntax Variants;

Restrictions

Benefits;

Bug Warnings

Arrays of random numbers x ?@$ y

x([: ? $)y

?. in place of ?

@: in place of @
# in place of $

does not create x $ y


x ? y Deal

Rank 0 0 -- operates on individual atoms of x and y, producing a result that may require fill -- WHY IS THIS IMPORTANT?


Selects x items at random (without repetition) from the list  i.y

   3?10
4 8 9
   3?10
2 4 7

It follows that  y?y permutes the items of (i.e. is a permutation of)  i.y

   10?10
7 2 6 0 5 1 3 8 4 9

Common uses

1. A random permutation (scrambling) of the integers 0 to 9

   10?10
7 2 6 0 5 1 3 8 4 9
   ?~10   NB. -can also be written this way.
3 8 9 2 0 6 1 7 5 4

2. Deal 3 cards from a pack of 52 cards

   ] s=: u: 16b2660 + i.4  NB. suits
♠♡♢♣
   d=: 'A23456789TJQK'     NB. denominations
   pack=: , d <@,"0/ s
   > (3?52) { pack         NB. deal 3 cards from 52
5♢
9♢
7♣

Related Primitives

Deal (Fixed seed) (x ?. y)


More Information

1. x may not be greater than y (after each argument has been rounded to an integer using tolerant comparison).


Caution

? produces unpredictable results - that's its job. The explicit-to-tacit translator doesn't know about this unpredictability, and may create a second execution of ?, unmindful of that fact that two executions of the same verb produce different results:

   r=. 3 : 'T - T=. ? y'           NB. regular monad containing call to Roll (?y)
   r 10 # 20                       NB. behaves as expected/intended
0 0 0 0 0 0 0 0 0 0
   rc=. 13 : 'T - T=. ? y'         NB. using (13 :) will give you wrong results
   rc 10 # 20
_4 _11 4 _2 _5 _3 3 5 _9 1

   d=. 3 : 'T - T=. y ? 20'        NB. regular monad containing call to Deal (x?y)
   d 10                            NB. behaves as expected/intended
0 0 0 0 0 0 0 0 0 0
   dc=. 13 : 'T - T=. y ? 20'      NB. using (13 :) will give you wrong results
   dc 10
0 _11 12 4 3 13 1 1 0 2

Reason is, the explicit-to-tacit translator produces two *separate* function calls to Roll or Deal, as can be seen from the suggestions for tacit definitions:

   rc                    
+-+-+-+
|?|-|?|
+-+-+-+
? - ?

   dc
+------------+-+------------+
|+--+-----+-+|-|+--+-----+-+|
||20|+-+-+|]|| ||20|+-+-+|]||
||  ||?|~|| || ||  ||?|~|| ||
||  |+-+-+| || ||  |+-+-+| ||
|+--+-----+-+| |+--+-----+-+|
+------------+-+------------+
(20 ?~ ]) - 20 ?~ ]