Moderní tvorba webových aplikací

O webu

Generátor náhodného čísla

Jak vygenerovat náhodné číslo z určitého rozsahu (v JavaScriptu, PHP atd.)

9 minut

Generátor kódu pro náhodná čísla

Následující generátor po zadání nejnižšího a nejvyššího čísla připraví JS/PHP kód, který slouží k vygenerování náhodného čísla z daného rozsahu.

(včetně)

(včetně)

JavaScript:

const nahodne = Math.floor(Math.random() * 10) + 1;

PHP:

random_int(1, 10);

Python:

import random
random.randint(1, 10)

Java:

import java.util.concurrent.ThreadLocalRandom;
int n = ThreadLocalRandom.current().nextInt(1, 11);

C#:

var n = Random.Shared.Next(1, 11);

Ruby:

rand(1.. 10)

Rust:

use rand::Rng;
let n = rand::thread_rng().gen_range(1..=10);

Go:

import (
  "crypto/rand"
  "math/big"
)
nBig, _ := rand.Int(rand.Reader, big.NewInt(10))
n := int(nBig.Int64()) + 1

Náhodné číslo v JavaScriptu

V JS se pro generování náhodného čísla používá Math.random().

const nahodne = Math.random();

V proměnné nahodne bude něco mezi 0 a 1, například 0.6577748781199532. Vyjít může i přesná nula, ale vždy bude číslo menší než 1.

Protože je zpravidla nutné mít čísla celá, násobí se to celé počtem požadovaných čísel. Tj. pro vygenerování deseti čísel:

nahodne = nahodne * 10;

Obsah nahodne teď bude něco jako 6.577748781199532. Pro dosažení celých čísel se potom provede zaokrouhlení.

nahodne = Math.floor(nahodne);

A výsledkem je 6. Metoda Math.floor zaokrouhluje dolů, takže výsledek bude nabývat hodnot 0 až 9. Použití jiného způsobu zaokrouhlení (Math.round/Math.ceil) by vedlo k nerovnoměrnému rozdělení jednotlivých čísel.

Následný obrázek srovnává četnosti jednotlivých čísel při různých způsobech zaokrouhlení.

Četnosti čísel

Skript pro výpočet četnosti

Je-li cílem dostat místo 0–9 číslo z rozsahu 1 až 10, stačí přičíst jedničku.

nahodne = nahodne + 1;

Potřebujete-li bezpečnou náhodnost (např. pro identifikátory nebo tokeny), použijte crypto.getRandomValues.

function secureRandomInt(min, max) {
  const range = max - min + 1;
  const buf = new Uint32Array(1);
  crypto.getRandomValues(buf);
  return min + (buf[0] % range);
}

Jakou náhodnost zvolit v JavaScriptu

Pro běžné UI a logiku použijte Math.random().

const n = Math.floor(Math.random() * 10) + 1;

Pro bezpečnost, tokeny a identifikátory použijte Web Crypto.

crypto.randomUUID();
const bytes = new Uint8Array(32);
crypto.getRandomValues(bytes);

Pro reprodukovatelné výsledky použijte seedovatelný PRNG.

TypeScript funkce

Užitečné typované funkce pro běžnou práci s náhodností v TypeScriptu.

Celé číslo v rozsahu:

export function randomInt(min: number, max: number): number {
  const a = Math.ceil(min);
  const b = Math.floor(max);
  return Math.floor(Math.random() * (b - a + 1)) + a;
}

Náhodná položka z pole:

export function randomItem(items: readonly T[]): T {
  if (items.length === 0) throw new Error('items must not be empty');
  const index = Math.floor(Math.random() * items.length);
  return items[index];
}

Bezpečné celé číslo pomocí Web Crypto:

export function secureRandomInt(min: number, max: number): number {
  const a = Math.ceil(min);
  const b = Math.floor(max);
  const range = b - a + 1;
  const buf = new Uint32Array(1);
  crypto.getRandomValues(buf);
  return a + (buf[0] % range);
}

Náhodné číslo PHP

V PHP je pro náhodné celé číslo z daného rozsahu doporučené použít random_int (od PHP 7). Funkci se zadává rozsah čísel, ze kterých se má výsledek vygenerovat.

Obě čísla parametrů znamenají včetně, takže následující kód vygeneruje čísla 1–10.

random_int(1, 10);

Pro kryptograficky bezpečná data (např. tokeny) použijte random_bytes a případně je převeďte do čitelného formátu.

Náhodné číslo v dalších jazycích

Nejčastější způsob, jak získat náhodné celé číslo v rozsahu min..max v populárních jazycích.

Python:

import random
random.randint(1, 10)  # včetně obou krajů

Go:

import (
  "crypto/rand"
  "math/big"
)

// 1..10 včetně
nBig, _ := rand.Int(rand.Reader, big.NewInt(10))
n := int(nBig.Int64()) + 1

Ruby:

rand(1..10) # včetně 1 i 10

Rust:

use rand::Rng;
let n = rand::thread_rng().gen_range(1..=10);

Java (Java 17+):

import java.util.concurrent.ThreadLocalRandom;
int n = ThreadLocalRandom.current().nextInt(1, 11); // 1..10

C# (.NET 6+):

var n = Random.Shared.Next(1, 11); // 1..10

Stále stejné náhodné číslo

Zvlášť při malém počtu čísel a malém počtu opakování se může stát, že bude nějaké číslo padat podezřele často.

Graf četnosti malého počtu generování
Četnost náhodných čísel z rozsahu 0–9 při pouhých deseti opakováních

Pokud prvek náhody nemusí být matematicky přesný, ale jde hlavně o dojem uživatele, dá se tomu trochu pomoci. Například zabránit vygenerování téhož čísla dvakrát po sobě.

Ukázka – nikdy se nevygeneruje stejné číslo dvakrát za sebou

Pokud je navíc cílem zobrazit všechny náhodné položky, hodí se ještě požadovat, aby se nějaké číslo mohlo vygenerovat podruhé až v okamžiku, kdy každé číslo z rozsahu už alespoň jednou padlo.

Živá ukázka

V případě PHP je nutné vygenerovaná náhodná čísla někam ukládat – například do pole $_SESSION.

Využití

Na základě vygenerování náhodného čísla se dá potom i vypisovat náhodný obsah.

Související články

Převod písmen na VELKÁ a malá

Převedení textu na velká nebo malá písmena.

12 minut

Detekce otevření DevTools

Jak zjistit, že se na stránce otevřely vývojářské nástroje.

13 minut

JavaScript null a undefined

Rozdíly mezi null a undefined v JavaScriptu, kdy je používat a jak se vyhnout běžným chybám.

12 minut

Sleep v JavaScriptu

Jak implementovat sleep/delay funkcionalitu v JavaScriptu pomocí Promise a async/await

6 minut

Web jecas.cz píše Bohumil Jahoda, kontakt
Seznam všech článků
2013–2025