How to generate a list of random numbers without duplicates in pure batch scripting?

前端 未结 5 1954
青春惊慌失措
青春惊慌失措 2020-12-07 03:51

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%

5条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-07 04:08

    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[
    

提交回复
热议问题