Variables are declared random using the `rand` or `randc` keyword. They can be used on normal variables, arrays, dynamic arrays or queues.

## rand

``````
class Packet;
rand int   		count;
rand byte  		master [\$];
rand bit [7:0]  data [];

...
endclass
``````

Let's take a simple class with a 3-bit variable called data that is randomized 10 times. The function `randomize()` is invoked as part of the class object to randomize all the `rand` type variables within that class object.

``````
class Packet;
rand bit [2:0] data;
endclass

module tb;
initial begin
Packet pkt = new ();
for (int i = 0 ; i < 10; i++) begin
pkt.randomize ();
\$display ("itr=%0d data=0x%0h", i, pkt.data);
end
end
endmodule
``````

Note that 0x2 and 0x1 are repeated multiple times.

Simulation Log
```run -all;
# KERNEL: itr=0 data=0x7
# KERNEL: itr=1 data=0x2
# KERNEL: itr=2 data=0x2
# KERNEL: itr=3 data=0x1
# KERNEL: itr=4 data=0x2
# KERNEL: itr=5 data=0x4
# KERNEL: itr=6 data=0x0
# KERNEL: itr=7 data=0x1
# KERNEL: itr=8 data=0x5
# KERNEL: itr=9 data=0x0
# KERNEL: Simulation has finished. There are no more test vectors to simulate.
```

Variables declared as `rand` are standard random variables and their values are uniformly distributed over their range. For example, the variable data from the code snippet above is an 8-bit unsigned integer with a range from 0 -> 255. If this variable is randomized without any constraints, then any value in this range will be assigned to the variable with equal probability. On successive randomization attempts the variable could end up having the same value, but the probability is 1/256.

## randc

``````
class Packet;
randc int	 	count;
randc byte 	 	master [\$];
randc bit [1:0] 	data [];

...
endclass
``````

Variables declared as `randc` are random-cyclic and hence cycle through all the values within their range before repeating any particular value. For example, the variable data from the code snippet above has a range from 0 -> 3. If this variable is randomized without any constraints, then any value in this range will be assigned to the variable, but for successive randomization the same value will repeat only after all the values have been assigned atleast once. `randc` variables are solved before other random variables.

We'll use the same example from above with a minor change - make data a `randc` variable.

``````
class Packet;
randc bit [2:0] data;
endclass

module tb;
initial begin
Packet pkt = new ();
for (int i = 0 ; i < 10; i++) begin
pkt.randomize ();
\$display ("itr=%0d data=0x%0h", i, pkt.data);
end
end
endmodule
``````

Note that all the values in the range 0 -> 3'h7 is exhausted before a value is repeated.

Simulation Log
```run -all;
# KERNEL: itr=0 data=0x6
# KERNEL: itr=1 data=0x3
# KERNEL: itr=2 data=0x4
# KERNEL: itr=3 data=0x7
# KERNEL: itr=4 data=0x0
# KERNEL: itr=5 data=0x1
# KERNEL: itr=6 data=0x5
# KERNEL: itr=7 data=0x2
# KERNEL: itr=8 data=0x5              // Start of a new sequence
# KERNEL: itr=9 data=0x0
# KERNEL: Simulation has finished. There are no more test vectors to simulate.
```