// Evol functions. // Authors: // gumi // jesusalva // Description: // Randomization helper functions. // pseudo-fix randomness // rand2( min, max ) function script rand2 { if (getargcount() == 2) { .@min=getarg(0)*100; .@max=getarg(1)*100+99; } else { .@min=0; .@max=getarg(0)*100-1; } return rand(.@min, .@max)/100; } // any({, ...}) // returns one argument randomly function script any { return getarg(rand2(getargcount())); } // any_of() // returns any member of the array function script any_of { return getelementofarray(getarg(0), getarrayindex(getarg(0)) + rand2(getarraysize(getarg(0)) - getarrayindex(getarg(0)))); } // relative_array_random() // returns a random entry from the array, by relative probability // the first key of the array should be 0 and every entries are a tuple // of [value, probability] function script relative_array_random { .@is_str = getdatatype(getarg(0)) & DATATYPE_STR; .@total_prob = getelementofarray(getarg(0), 0); .@initial_index = getarrayindex(getarg(0)); .@initial_index = .@initial_index ? .@initial_index : 1; freeloop(true); if (.@total_prob < 1 || getarg(1, false)) { // first calculation, or forced re-calculation .@total_prob = 0; .@size = getarraysize(getarg(0)); for (.@i = .@initial_index + 1; .@i < .@size; .@i += 2) { if (.@is_str) { .@total_prob += max(1, atoi(getelementofarray(getarg(0), .@i))); } else { .@total_prob += max(1, getelementofarray(getarg(0), .@i)); } } // we cache on the first key set(getelementofarray(getarg(0), 0), .@total_prob); } .@target_sum = rand2(0, .@total_prob); for (.@i = .@initial_index; .@sum < .@target_sum; .@i += 2) { if (.@is_str) { .@sum += atoi(getelementofarray(getarg(0), .@i + 1)); } else { .@sum += getelementofarray(getarg(0), .@i + 1); } if (.@sum >= .@target_sum) { break; } } freeloop(false); return getelementofarray(getarg(0), .@i); }