random: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(alt syntax, joined notes. If anyone wishes to separate them again and fix broken note, be my guest)
m (Fix)
 
(88 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{Command|= Comments
{{RV|type=command
____________________________________________________________________________________________


| ofp |= Game name
|game1= ofp
|version1= 1.00


|1.00|= Game version
|game2= ofpe
____________________________________________________________________________________________
|version2= 1.00


|[[Image:bellcurve.jpg|right|200px]] Random real (floating point) value from 0 (inclusive) to x (not inclusive).<br><br>
|game3= arma1
Since Arma 3 v1.55.133393 alternative syntax is added, allowing to define [https://en.wikipedia.org/wiki/Normal_distribution Gaussian Distribution] params. Uses the same method as [[setTriggerTimeout]] command. Quite useful for spawning loot for example, making more valueable items more rare. |= Description
|version3= 1.00
____________________________________________________________________________________________


|'''random''' x |= Syntax
|game4= arma2
|version4= 1.00
 
|game5= arma2oa
|version5= 1.50
 
|game6= tkoh
|version6= 1.00
 
|game7= arma3
|version7= 0.50
 
|gr1= Math
 
|descr= [[File:bellcurve.jpg|thumb|120px|[[#Syntax 2|Syntax&nbsp;2]]'s distribution]]
{{{!}} class="valign-top"
! style="padding-right: 1em; white-space: nowrap" {{!}} {{Link|#Syntax 1}}
{{!}} generates a random floating point value
{{!}}-
! style="padding-right: 1em; white-space: nowrap" {{!}} {{Link|#Syntax 2}}
{{!}} generates a {{Link|https://en.wikipedia.org/wiki/Normal_distribution|Gaussian Distribution}}<ref>Technically, it is a rescaled {{Link|https://en.wikipedia.org/wiki/Bates_distribution}} with n = 4.
The distribution is split in two at its midpoint and scaled linearly such that its maximum lies at the specified midpoint.</ref>.<!--
--> It uses the same method as [[setTriggerTimeout]] command and is quite useful for e.g spawning loot, making more valuable items more rare
{{!}}-
! style="padding-right: 1em; white-space: nowrap" {{!}} {{Link|#Syntax 3}}
{{!}} generates a {{Link|https://en.wikipedia.org/wiki/Random_seed|seed-based}} random number
{{!}}-
! style="padding-right: 1em; white-space: nowrap" {{!}} {{Link|#Syntax 4}}
{{!}} generates a {{Link|https://en.wikipedia.org/wiki/Random_seed|seed-based}} random noise ('''not''' Perlin) texture based on provided seed and returning the value at supplied coordinates
{{!}}}
 
|s1= [[random]] x


|p1= x: [[Number]]
|p1= x: [[Number]]


| [[Number]] |= Return value
|r1= [[Number]] from 0 (included) to ''x'', '''ex'''cluded
{{Feature|important|''x'' was accidentally '''in'''cluded due to a bug introduced in {{GVI|arma2|1.00|size= 0.75}} and fixed in {{GVI|arma3|2.18|size= 0.75}}.}}


|s2= '''random''' [min, mid, max] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;''Since Arma 3 v1.55.133393''|= Syntax
|s2= [[random]] [min, mid, max]


|p21=  [min, mid, max]: [[Array]] |=
|s2since= arma3 1.56
|p22= min: [[Number]] |=
|p23= med: [[Number]] |=
|p24= max: [[Number]] |=


| r2= [[Number]] |= Return value
|p21= min: [[Number]]
____________________________________________________________________________________________
 
|x1= <code>_rNumber = [[random]] 1;</code>  |= Example 1


|x2= <code>_rNumber = [[random]] -10;</code>  |= Example 2
|p22= mid: [[Number]]


|x3= To select random value from an array:
|p23= max: [[Number]]
<code>_array = ["apples", "pears", "bananas", "M16"];
_random = _array [[select]] [[floor]] [[random]] [[count]] _array;</code>  |= Example 3


|x4= Compare (each command was executed 100000 times to gather statistics):<code>[[floor]] [[random]] 10;
|r2= [[Number]] in range from ''min'' to ''max'', weighted by ''mid'' - '''can''' be higher than max (maximum value is {{hl|min + max - mid}})
// 0 - 10099 (10%)
// 1 - 10040 (10%)
// 2 - 10154 (10%)
// 3 - 9910 (10%)
// 4 - 10023 (10%)
// 5 - 9937 (10%)
// 6 - 10118 (10%)
// 7 - 9716 (10%)
// 8 - 9986 (10%)
// 9 - 10017 (10%)


[[floor]] [[random]] [0,5,10];
|s3= seed [[random]] x
// 0 - 109 (0%)
// 1 - 1604 (2%)
// 2 - 6839 (7%)
// 3 - 16671 (17%)
// 4 - 24706 (25%)
// 5 - 24702 (25%)
// 6 - 16626 (17%)
// 7 - 6925 (7%)
// 8 - 1702 (2%)
// 9 - 116 (0%)


[[floor]] [[random]] [0,10,10];
|s3since= arma3 1.68
// 0 - 9 (0%)
// 1 - 94 (0%)
// 2 - 420 (0%)
// 3 - 1197 (1%)
// 4 - 2361 (2%)
// 5 - 4447 (4%)
// 6 - 7082 (7%)
// 7 - 9512 (10%)
// 8 - 11889 (12%)
// 9 - 13093 (13%)
// 10 - 49896 (50%)


[[floor]] [[random]] [0,10,5];
|p41= seed: [[Number]] - an '''integer'''. Any float value will be truncated (e.g -0.9, -0.1, 0.1 or 0.9 will be read as '''0''')
// 0 - 11 (0%)
// 1 - 98 (0%)
// 2 - 430 (0%)
// 3 - 1149 (1%)
// 4 - 2384 (2%)
// 5 - 4546 (5%)
// 6 - 8612 (9%)
// 7 - 16283 (16%)
// 8 - 28393 (28%)
// 9 - 38094 (38%)</code>  |= Example 2
____________________________________________________________________________________________


| [[Math Commands]], [[selectRandom]] |= See also
|p42= x: [[Number]]


}}
|r3= [[Number]] from 0 (included) to ''x'' ('''in'''cluded)
 
|s4= seed [[random]] [x, y]
 
|s4since= arma3 1.68
 
|p61= seed: [[Number]]
 
|p62= x: [[Number]] - x texture position
 
|p63= y: [[Number]] - y texture position
 
|r4= [[Number]] from 0 (included) to 1 ('''ex'''cluded)
 
|x1= <sqf>_rNumber = random 1;</sqf>
 
|x2= <sqf>_rNumber = random -10;</sqf>
 
|x3= Generate a random position inside a circle (see also [[Example Code: Random Area Distribution]])
<sqf>_center getPos [_radius * sqrt random 1, random 360];</sqf>
 
|x4= Select a random value from an array:
<sqf>
_array = ["apples", "pears", "bananas", "M16"];
 
_random = _array select floor random count _array; // before {{arma2}}
_random = _array call BIS_fnc_selectRandom; // since {{arma2}}
_random = selectRandom _array; // since {{arma3}} v1.56
</sqf>
 
|x5= Visualisation of {{Link|#Syntax 4}} (warning, it takes a bit to execute and draw):<br>
[[File:A3 random syntax4.png|thumb|right|Result]]
<sqf>
private _parent = call BIS_fnc_displayMission;
if (is3DEN) then { _parent = findDisplay 313 };
private _display = _parent createDisplay "RscDisplayEmpty";
private _background = _disp ctrlCreate ["RscBackground", -1];
 
private _coef = 0.1;


<h3 style="display:none">Notes</h3>
for "_x" from 1 to 100 do
{
for "_y" from 1 to 100 do
{
private _random = 0 random [_x * _coef, _y * _coef];
private _dot = _display ctrlCreate ["RscBackground", -1];


[[Category:Scripting Commands|RANDOM]]
_dot ctrlSetPosition [0.5 + pixelW * _x, 0.5 + pixelH * _y, pixelW, pixelH];
[[Category:Scripting Commands OFP 1.99|{{uc:{{PAGENAME}}}}]]
_dot ctrlSetBackgroundColor [_random, _random, _random, 1];
[[Category:Scripting Commands OFP 1.96|RANDOM]]
_dot ctrlCommit 0;
[[Category:Scripting Commands OFP 1.46|RANDOM]]
};
[[Category:Scripting Commands ArmA|RANDOM]]
};
[[Category:Command_Group:_Variables|{{uc:{{PAGENAME}}}}]]
</sqf>
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]


<!-- CONTINUE Notes -->
|seealso= [[selectRandom]] [[selectRandomWeighted]] [[Example Code: Random Area Distribution]]
<dl class="command_description">
}}
<dd class="notedate">Posted on July 12, 2015 - 20:32 (UTC)</dd>
<dt class="note">[[User:Hcpookie|Hcpookie]]</dt>
<dd class="note">
Random selections including negative numbers can be obtained via:


<code>_Xrnd = round(random 200) -100;</code>
{{Note
|user= Hcpookie
|timestamp= 20150712203200
|text= Random selections including negative numbers can be obtained via:
<sqf>_xRnd = round (random 200) - 100;</sqf>


This will yield numbers between -100 and 100.
This will yield numbers between -100 and 100.
* Be careful using random numbers in multiplayer, each client will come up with a different result. See multiplayer tutorials for more general information about locality.
* The number returned is unlikely to be a whole number.<br>
To return a whole number use either '''[[round]]''', '''[[ceil]]''' or '''[[floor]]''' together with [[random]]:
<sqf>
x = round (random 5) // will return 0, 1, 2, 3, 4 or 5. (non-uniform distribution, 0 and 5 are half as likely to be selected than any of the other numbers)
x = floor (random 5) // will return 0, 1, 2, 3 or 4. (uniform distribution, all numbers have the same probability of being selected)
x = ceil (random 5) // will return 0, 1, 2, 3, 4 or 5. (0 is very unlikely, but possible, as ceil 0 is 0)
</sqf>
}}


* Be careful using random numbers in multiplayer, each client will come up with a different result. See multiplayer tutorials for more general information about locality.
{{Note
* The number returned is unlikely to be a whole number.<br>To return a whole number use either '''[[round]]''', '''[[ceil]]''' or '''[[floor]]''' together with '''random''':<br>
|user= Lou Montana
x=round(random 5) will return 0,1,2,3,4 or 5. (non-uniform distribution, 0 and 5 are half as likely to be selected than any of the other numbers)
|timestamp= 20180722125800
<br>x=floor(random 5) will return 0,1,2,3 or 4.  (uniform distribution, all numbers have the same probability of being selected)
|text= <nowiki/>
<br>x=ceil(random 5) will return  0,1,2,3,4 or 5. (0 is very unlikely, but possible, as ceil 0 is 0)
{{{!}} class="wikitable align-right align-left-col-1 align-center-row-1"
</dd>
{{!}}+ Repartition comparison
</dl>
! Formula
<!-- DISCONTINUE Notes -->
! 0
! 1
! 2
! 3
! 4
! 5
! 6
! 7
! 8
! 9
{{!}}-
{{!}} <sqf>floor random 10</sqf>
{{!}} 10%
{{!}} 10%
{{!}} 10%
{{!}} 10%
{{!}} 10%
{{!}} 10%
{{!}} 10%
{{!}} 10%
{{!}} 10%
{{!}} 10%
{{!}}-
{{!}} <sqf>floor random [0, 5, 10]</sqf>
{{!}} 0%
{{!}} 2%
{{!}} 7%
{{!}} 17%
{{!}} 25%
{{!}} 25%
{{!}} 17%
{{!}} 7%
{{!}} 2%
{{!}} 0%
{{!}}-
{{!}} <sqf>floor random [0, 10, 0]</sqf>
{{!}} 0%
{{!}} 0%
{{!}} 1%
{{!}} 2%
{{!}} 5%
{{!}} 9%
{{!}} 14%
{{!}} 19%
{{!}} 24%
{{!}} 26%
{{!}}-
{{!}} <sqf>floor random [0, 10, 5]</sqf>
{{!}} 0%
{{!}} 0%
{{!}} 0%
{{!}} 1%
{{!}} 2%
{{!}} 5%
{{!}} 9%
{{!}} 16%
{{!}} 28%
{{!}} 38%
{{!}}}
}}

Latest revision as of 11:21, 13 March 2024

Hover & click on the images for description

Description

Description:
Syntax 2's distribution
Syntax 1 generates a random floating point value
Syntax 2 generates a Gaussian Distribution[1]. It uses the same method as setTriggerTimeout command and is quite useful for e.g spawning loot, making more valuable items more rare
Syntax 3 generates a seed-based random number
Syntax 4 generates a seed-based random noise (not Perlin) texture based on provided seed and returning the value at supplied coordinates
Groups:
Math

Syntax 1

Syntax:
random x
Parameters:
x: Number
Return Value:
Number from 0 (included) to x, excluded
x was accidentally included due to a bug introduced in Logo A2.png1.00 and fixed in Arma 3 logo black.png2.18.

Syntax 2

Syntax:
random [min, mid, max]
Parameters:
min: Number
mid: Number
max: Number
Return Value:
Number in range from min to max, weighted by mid - can be higher than max (maximum value is min + max - mid)

Syntax 3

Syntax:
seed random x
Parameters:
seed: Number - an integer. Any float value will be truncated (e.g -0.9, -0.1, 0.1 or 0.9 will be read as 0)
x: Number
Return Value:
Number from 0 (included) to x (included)

Syntax 4

Syntax:
seed random [x, y]
Parameters:
seed: Number
x: Number - x texture position
y: Number - y texture position
Return Value:
Number from 0 (included) to 1 (excluded)

Examples

Example 1:
_rNumber = random 1;
Example 2:
_rNumber = random -10;
Example 3:
Generate a random position inside a circle (see also Example Code: Random Area Distribution)
_center getPos [_radius * sqrt random 1, random 360];
Example 4:
Select a random value from an array:
_array = ["apples", "pears", "bananas", "M16"]; _random = _array select floor random count _array; // before Arma 2 _random = _array call BIS_fnc_selectRandom; // since Arma 2 _random = selectRandom _array; // since Arma 3 v1.56
Example 5:
Visualisation of Syntax 4 (warning, it takes a bit to execute and draw):
Result
private _parent = call BIS_fnc_displayMission; if (is3DEN) then { _parent = findDisplay 313 }; private _display = _parent createDisplay "RscDisplayEmpty"; private _background = _disp ctrlCreate ["RscBackground", -1]; private _coef = 0.1; for "_x" from 1 to 100 do { for "_y" from 1 to 100 do { private _random = 0 random [_x * _coef, _y * _coef]; private _dot = _display ctrlCreate ["RscBackground", -1]; _dot ctrlSetPosition [0.5 + pixelW * _x, 0.5 + pixelH * _y, pixelW, pixelH]; _dot ctrlSetBackgroundColor [_random, _random, _random, 1]; _dot ctrlCommit 0; }; };

Additional Information

See also:
selectRandom selectRandomWeighted Example Code: Random Area Distribution

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
Hcpookie - c
Posted on Jul 12, 2015 - 20:32 (UTC)
Random selections including negative numbers can be obtained via:
_xRnd = round (random 200) - 100;
This will yield numbers between -100 and 100.
  • Be careful using random numbers in multiplayer, each client will come up with a different result. See multiplayer tutorials for more general information about locality.
  • The number returned is unlikely to be a whole number.
To return a whole number use either round, ceil or floor together with random:
x = round (random 5) // will return 0, 1, 2, 3, 4 or 5. (non-uniform distribution, 0 and 5 are half as likely to be selected than any of the other numbers) x = floor (random 5) // will return 0, 1, 2, 3 or 4. (uniform distribution, all numbers have the same probability of being selected) x = ceil (random 5) // will return 0, 1, 2, 3, 4 or 5. (0 is very unlikely, but possible, as ceil 0 is 0)
Lou Montana - c
Posted on Jul 22, 2018 - 12:58 (UTC)
Repartition comparison
Formula 0 1 2 3 4 5 6 7 8 9
floor random 10
10% 10% 10% 10% 10% 10% 10% 10% 10% 10%
floor random [0, 5, 10]
0% 2% 7% 17% 25% 25% 17% 7% 2% 0%
floor random [0, 10, 0]
0% 0% 1% 2% 5% 9% 14% 19% 24% 26%
floor random [0, 10, 5]
0% 0% 0% 1% 2% 5% 9% 16% 28% 38%
  1. Technically, it is a rescaled Bates distribution with n = 4. The distribution is split in two at its midpoint and scaled linearly such that its maximum lies at the specified midpoint.