criando um número aleatório usando MYSQL


95

Gostaria de saber se existe uma maneira de selecionar um número gerado aleatoriamente entre 100 e 500 junto com uma consulta selecionada.

Por exemplo: SELECT name, address, random_number FROM users

Eu não tenho que armazenar esse número no banco de dados e apenas usá-lo para exibir o propósito.

Eu tentei algo assim, mas não consigo funcionar ..

SELECT name, address, FLOOR(RAND() * 500) AS random_number FROM users

Espero que alguém me ajude. Obrigado


Respostas:


145

Isso deve dar o que você deseja:

FLOOR(RAND() * 401) + 100

Genericamente, FLOOR(RAND() * (<max> - <min> + 1)) + <min>gera um número entre <min> e <max>inclusivo.

Atualizar

Esta declaração completa deve funcionar:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users

como eu uso este código. Tentei assim - FLOOR (RAND () * 401) + 100 como número, mas não funciona
TNK de

NOTA: Eu não tenho uma coluna chamada 'número' no meu banco de dados. Esta coluna deve ser gerada dinamicamente. é possível?
TNK de

1
@EdHeal Na verdade, acho round()que dará uma distribuição não uniforme.
Ja͢ck de

1
É melhor armazenar o resultado em uma variável e usar a variável se você tiver replicação mestre / escravo. SET @r=FLOOR(RAND() * 401) + 100, então SELECT @r.
Qian Chen

3
RAND(), UUID(), NOW()São funções indeterministas. A chamada de tais funções deve ser evitada de ser gravada no log bin para replicação. Por exemplo. INSERT INTO t SET ID=UUID();fará com que o valor dos IDcampos seja diferente no mestre e nos escravos. Em vez disso, ele precisa ser escrito como SET @uuid:=UUID();e INSERT INTO t SET ID=@uuid;, em seguida, executá-los em uma única transação. Isso será seguro para replicação. Este é um assunto um pouco fora do assunto para esta questão. Não diz que sua resposta tem algum problema. :)
Qian Chen

10

As RANDproduz um número 0 <= v <1,0 (consulte a documentação ) que você precisa usar ROUNDpara garantir que pode obter o limite superior (500 neste caso) e o limite inferior (100 neste caso)

Portanto, para produzir a variedade de que você precisa:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users

Esta codificação funciona assim - SELECT ROUND (100,0 + 400,0 * RAND ()) AS random_number, mas agora trabalhando com minha consulta
TNK de

A coluna random_number deve ser uma coluna gerada aleatoriamente junto com minha consulta.
TNK de

1
Este método tornará o primeiro e o último número menos prováveis.
Slobodan Pejic

4

Além desta resposta, crie uma função como

CREATE FUNCTION myrandom(
    pmin INTEGER,
    pmax INTEGER
)
RETURNS INTEGER(11)
DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
BEGIN
  RETURN floor(pmin+RAND()*(pmax-pmin));
END; 

e ligue como

SELECT myrandom(100,300);

Isso dá a você um número aleatório entre 100 e 300


3

Você pode criar um número aleatório usando FLOOR(RAND() * n) as randnum(n é um inteiro), entretanto, se você não precisa que o mesmo número aleatório seja repetido, você terá que armazená-lo em uma tabela temporária. Então você pode verificar com where randnum not in (select * from temptable)...


3

ambos estão funcionando bem:

select round(<maxNumber>*rand())

FLOOR(RAND() * (<max> - <min> + 1)) + <min> // generates a number
between <min> and <max> inclusive.

0

Esta é a fórmula correta para encontrar inteiros de ipara jondei <= R <= j

FLOOR(min+RAND()*(max-min))

3
Isso está errado, ele nunca produzirá j (ou max). Ele produz um número i <= R <j.
jlh

1
Deve ser:FLOOR(min+RAND()*(max-min+1))
David Rodrigues
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.