kzen.dev
  • Jautājumi
  • Tagi
  • Lietotāji
Paziņojumi
Apbalvojumi
Reģistrācija
Pēc reģistrēšanās jums tiks paziņots par atbildēm un komentāriem uz jūsu jautājumiem.
Pieslēgties
Ja jums jau ir konts, piesakieties, lai pārbaudītu jaunus paziņojumus.
Būs atlīdzība par pievienotajiem jautājumiem, atbildēm un komentāriem.
Vairāk
Avots
Rediģēt
 zacharyliu
zacharyliu
Question

Nejaušinātu veselu skaitļu ģenerēšana JavaScript programmā noteiktā diapazonā?

Kā es varu ģenerēt nejaušus veselus skaitļus starp diviem norādītajiem mainīgajiem JavaScript, piemēram, x = 4 un y = 8, lai izvadītu jebkuru no 4, 5, 6, 6, 7, 8?

1823 2009-10-06T20:05:41+00:00 3
 thadeuszlay
thadeuszlay
Rediģēts jautājums 11pēcpusdienari0t martā 2019 в 1:34
Programmēšana
javascript
random
integer
Popular videos
How to Generate Random Whole Numbers Within a Range in JavaScript
How to Generate Random Whole Numbers Within a Range in JavaScript
pirms 2 gadiem
How to Generate Random Numbers in JavaScript - Math.random
How to Generate Random Numbers in JavaScript - Math.random
pirms 5 gadiem
How to Generate Random Numbers in Javascript within Range
How to Generate Random Numbers in Javascript within Range
pirms 4 gadiem
« Iepriekšējais
Nākamais »
Šim jautājumam ir 1 atbildi angļu valodā, lai tos izlasītu ieiet savā kontā.
Solution / Answer
Ionuț  G. Stan
Ionuț G. Stan
6pēcpusdienari1t oktobrī 2009 в 8:08
2009-10-06T20:08:19+00:00
Vairāk
Avots
Rediģēt
#9550851

Daži piemēri ir atrodami Mozilla Developer Network lapā:

/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */
function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
}

/**
 * Returns a random integer between min (inclusive) and max (inclusive).
 * The value is no lower than min (or the next integer greater than min
 * if min isn't an integer) and no greater than max (or the next integer
 * lower than max if max isn't an integer).
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Lūk, kāda ir tā loģika. Tas ir vienkāršs trīs likums:

Math.random() atgriež skaitli starp 0 (ieskaitot) un 1 (izslēdzot). Tātad mums ir šāds intervāls:

[0 .................................... 1)

Tagad mēs vēlamies skaitli starp min (ieskaitot) un max (izslēdzot):

[0 .................................... 1)
[min .................................. max)

Mēs varam izmantot Math.random, lai iegūtu atbilstošo skaitli intervālā [min, max]. Bet vispirms mums vajadzētu mazliet izlīdzināt problēmu, atņemot min no otrā intervāla:

[0 .................................... 1)
[min - min ............................ max - min)

Tādējādi iegūstam:

[0 .................................... 1)
[0 .................................... max - min)

Tagad varam izmantot Math.random un aprēķināt atbilstošo. Izvēlēsimies nejaušu skaitli:

                Math.random()
                    |
[0 .................................... 1)
[0 .................................... max - min)
                    |
                    x (what we need)

Tātad, lai atrastu x, mēs izdarītu:

x = Math.random() * (max - min);

Neaizmirstiet pievienot atpakaļ min, lai iegūtu skaitli intervālā [min, max]:

x = Math.random() * (max - min) + min;

Tā bija pirmā funkcija no MDN. Otrā atgriež veselu skaitli starp min un max, abus ieskaitot.

Lai iegūtu veselos skaitļus, var izmantot round, ceil vai floor.

Varētu izmantot Math.round(Math.random() * (max - min)). + min, tomēr tas dod nevienmērīgu sadalījumu. Gan min, gan max ir tikai aptuveni puse no izlozes iespējām:

min...min+0.5...min+1...min+1.5   ...    max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘   ← Math.round()
   min          min+1                          max

Izslēdzot max no intervāla, tam ir vēl mazāka izredzes izkrīt nekā min.

Ar Math.floor(Math.random() * (max - min +1)) + min ir pilnīgi vienmērīgs sadalījums.

min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)
|        |        |         |        |        |
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘   ← Math.floor()
   min     min+1               max-1    max

Šajā vienādojumā nevar izmantot ceil() un -1, jo max tagad bija nedaudz mazāka iespēja, bet var izspēlēt arī (nevēlamo) min-1 rezultātu.

 micnic
micnic
Rediģēta atbilde 13priekšpusdienari5t aprīlī 2019 в 9:01
Mozilla logo
developer.mozilla.org
3623
0
Do you have a question? Add it on the site and get an answer instantly
en.kzen.dev
Gordon Gustafson
Gordon Gustafson
6pēcpusdienari1t oktobrī 2009 в 8:08
2009-10-06T20:08:20+00:00
Vairāk
Avots
Rediģēt
#9550852
function getRandomizer(bottom, top) {
    return function() {
        return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
    }
}

izmantošana:

var rollDie = getRandomizer( 1, 6 );

var results = ""
for ( var i = 0; i<1000; i++ ) {
    results += rollDie() + " ";    //make a string filled with 1000 random numbers in the range 1-6.
}

sadalījums:

Mēs atgriežam funkciju (aizgūtu no funkcionālās programmēšanas), kas pēc izsaukuma atgriež nejaušu veselu skaitli starp vērtībām bottom un top, ieskaitot. Mēs sakām "ieskaitot", jo vēlamies, lai atgriezto skaitļu diapazonā būtu gan bottom, gan top. Tādējādi getRandomizer( 1, 6 ) atgriezīs 1, 2, 3, 4, 5 vai 6.

(apakšējais skaitlis ir mazāks skaitlis, augšējais skaitlis ir lielāks skaitlis).

Math.random() * ( 1 + top - bottom )

Math.random() atgriež nejaušu divkāršu skaitli starp 0 un 1, un, ja to reizināsim ar vienu plus starpību starp augšējā un apakšējā, iegūsim divkāršu skaitli kaut kur starp 0 un 1+b-a.

Math.floor( Math.random() * ( 1 + top - bottom ) )

Math.floor noapaļo skaitli uz leju līdz tuvākajam veselam skaitlim. Tātad tagad mums ir visi veseli skaitļi starp 0 un augšējā un apakšējā daļa. 1 izskatās mulsinoši, bet tam ir jābūt, jo mēs vienmēr noapaļojam uz leju, tāpēc augšējais skaitlis bez tā nekad netiks sasniegts. Ģenerētajam nejaušajam decimālskaitlim jābūt no 0 līdz (1+top-bottom), lai mēs varētu noapaļot uz leju un iegūt int no 0 līdz top-bottom.

Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom

Iepriekšējā piemērā dotais kods deva veselu skaitli diapazonā 0 un top-bottom, tāpēc tagad mums tikai jāpievieno šim rezultātam bottom, lai iegūtu veselu skaitli diapazonā no bottom līdz top ieskaitot :D :D


PIEZĪME: Ja vispirms nodosiet vērtību, kas nav vesels skaitlis, vai lielāku skaitli, jūs iegūsiet nevēlamu uzvedību, bet, ja neviens to nepieprasīs, es neiedziļināšos argumentu pārbaudes kodā, jo tas ir diezgan tālu no sākotnējā jautājuma nolūka.

Gordon Gustafson
Gordon Gustafson
Rediģēta atbilde 14pēcpusdienari5t jūlijā 2012 в 4:16
55
0
Do you have a question? Add it on the site and get an answer instantly
en.kzen.dev
 Chris
Chris
6pēcpusdienari1t oktobrī 2009 в 8:09
2009-10-06T20:09:28+00:00
Vairāk
Avots
Rediģēt
#9550853
function getRandomInt(lower, upper)
{
    //to create an even sample distribution
    return Math.floor(lower + (Math.random() * (upper - lower + 1)));

    //to produce an uneven sample distribution
    //return Math.round(lower + (Math.random() * (upper - lower)));

    //to exclude the max value from the possible values
    //return Math.floor(lower + (Math.random() * (upper - lower)));
}

Lai pārbaudītu šo funkciju un tās variācijas, saglabājiet zemāk redzamo HTML/JavaScript failā un atveriet to pārlūkprogrammā. Kods izveidos grafiku, kurā būs redzams viena miljona funkcijas izsaukumu sadalījums. Kods reģistrēs arī malējos gadījumus, tāpēc, ja funkcija radīs vērtību, kas ir lielāka par maksimālo vai mazāka par minimālo, jūs.par.to.uzzināsiet.

<html>
    <head>
        <script type="text/javascript">
        function getRandomInt(lower, upper)
        {
            //to create an even sample distribution
            return Math.floor(lower + (Math.random() * (upper - lower + 1)));

            //to produce an uneven sample distribution
            //return Math.round(lower + (Math.random() * (upper - lower)));

            //to exclude the max value from the possible values
            //return Math.floor(lower + (Math.random() * (upper - lower)));
        }

        var min = -5;
        var max = 5;

        var array = new Array();

        for(var i = 0; i <= (max - min) + 2; i++) {
          array.push(0);
        }

        for(var i = 0; i < 1000000; i++) {
            var random = getRandomInt(min, max);
            array[random - min + 1]++;
        }

        var maxSample = 0;
        for(var i = 0; i < max - min; i++) {
            maxSample = Math.max(maxSample, array[i]);
        }

        //create a bar graph to show the sample distribution
        var maxHeight = 500;
        for(var i = 0; i <= (max - min) + 2; i++) {
            var sampleHeight = (array[i]/maxSample) * maxHeight;

            document.write('<span style="display:inline-block;color:'+(sampleHeight == 0 ? 'black' : 'white')+';background-color:black;height:'+sampleHeight+'px"> [' + (i + min - 1) + ']: '+array[i]+'</span>  ');
        }
        document.write('<hr/>');
        </script>
    </head>
    <body>

    </body>
</html>
 Chris
Chris
Rediģēta atbilde 10pēcpusdienari1t aprīlī 2012 в 7:06
6
0
Pievienot jautājumu
Kategorijas
Viss
Tehnoloģija
Kultūra / atpūta
Dzīve / Māksla
Zinātne
Profesionāls
Uzņēmējdarbība
Lietotāji
Visi
Jauns
Populārs
1
Александр Македонский
Reģistrēts pirms 1 dienas
2
Andrei Kalinin
Reģistrēts pirms 2 nedēļām
3
Koroleva Ego
Reģistrēts pirms 1 mēneša
4
Star Lenon
Reģistrēts pirms 1 mēneša
5
Данил Жевнеров
Reģistrēts pirms 1 mēneša
Do you have a question? Add it on the site and get an answer instantly
en.kzen.dev
DE
EL
ES
FI
FR
ID
IT
JA
LT
LV
NL
NO
PT
RO
SK
TR
ZH
© kzen.dev 2023
Avots
stackoverflow.com
saskaņā ar licenci cc by-sa 3.0 ar attiecinājumu