I want to generate a list of random numbers with a predefined number of items %RND_TOTAL% in the given range from %RND_MIN% to %RND_MAX%
Next script first populates a temporary array with all numbers from target domain, then picks from it elements one by one at random positions into new array:
@echo off
setlocal
setlocal enabledelayedexpansion
:: Populate array with all target numbers
for /L %%I in (%rnd_min%,1,%RND_max%) do (
set /a idx="%%I"
set "array[!idx!]=%%I
)
set /A I_NEED_SO_MANY_RANDOM_VALUES=%RND_max%-%rnd_min%
set /A TOTAL_UNUSED==%RND_max%-%rnd_min%
for /L %%I in (0,1,%I_NEED_SO_MANY_RANDOM_VALUES%) do (
SET /A next_pick_index=!RANDOM! %% !TOTAL_UNUSED!
SET /A TOTAL_UNUSED-=1
for /f "tokens=* delims= " %%a in ('echo !TOTAL_UNUSED!') do set unused_random=!array[%%a]!
::pick random value from initial array
for /f "tokens=* delims= " %%a in ('echo !next_pick_index!') do set next_random=!array[%%a]!
:: swap picked random value with the last not-used element in array
SET "array[!next_pick_index!]=!unused_random!"
:: put picked random value into new array
SET "randomized_array[%%I]=!next_random!"
)
::output array to console
SET randomized_array[