MYSQL을 사용하여 난수 생성


96

선택 쿼리와 함께 100에서 500 사이의 무작위로 생성 된 숫자를 선택하는 방법이 있는지 알고 싶습니다.

예 : SELECT name, address, random_number FROM users

이 번호를 db에 저장할 필요가 없으며 목적을 표시하기 위해서만 사용합니다.

이런 식으로 해봤는데 작동이 안되네요 ..

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

누군가 나를 도와주기를 바랍니다. 감사합니다


답변:


146

이것은 당신이 원하는 것을 줄 것입니다.

FLOOR(RAND() * 401) + 100

일반적으로 >와 포함 FLOOR(RAND() * (<max> - <min> + 1)) + <min>사이의 숫자를 생성 합니다.<min<max>

최신 정보

이 전체 설명은 다음과 같이 작동합니다.

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

이 코드를 사용하는 방법. 나는 이렇게 시도했다-FLOOR (RAND () * 401) + 100을 숫자로했지만 작동하지 않습니다
TNK

참고 : DB에 'number'라는 열이 없습니다. 이것은 동적으로 생성 된 열이어야합니다. 가능합니까?
TNK 2013

1
@EdHeal 사실 나는 round()불균일 분포를 줄 것이라고 생각 합니다.
Ja͢ck 2013-02-10

1
결과를 변수에 저장하고 마스터 슬레이브 복제가있는 경우 변수를 사용하는 것이 좋습니다. SET @r=FLOOR(RAND() * 401) + 100, SELECT @r.
키안 첸

3
RAND(), UUID(), NOW()비결정론 적 기능입니다. 이러한 함수의 호출은 복제를 위해 bin 로그에 기록되지 않도록해야합니다. 예를 들면. 필드 INSERT INTO t SET ID=UUID();의 값이 ID마스터와 슬레이브에서 달라집니다. 대신,로 작성된 SET @uuid:=UUID();다음 INSERT INTO t SET ID=@uuid;단일 트랜잭션에서 실행해야합니다. 이것은 복제 안전합니다. 이것은이 질문에 대한 약간의 주제입니다. 귀하의 답변에 문제가 있다고 말하지 않습니다. :)
키안 첸

10

으로 RAND숫자 0 <생산 = V <1.0 (참조 설명서 ) 사용해야하는 ROUND당신은 상단 (이 경우 500)를 결합 및 하부 (이 경우 100) 바인딩받을 수 있도록

따라서 필요한 범위를 생성하려면 다음을 수행하십시오.

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

이 코딩은 다음과 같이 작동합니다-SELECT ROUND (100.0 + 400.0 * RAND ()) AS random_number,하지만 이제는 내 쿼리와 함께 작동합니다.
TNK

random_number 열은 내 쿼리와 함께 임의로 생성 된 열이어야합니다.
TNK 2013

1
이 방법은 첫 번째와 마지막 숫자의 가능성을 줄입니다.
Slobodan Pejic

4

이 답변에 추가로 다음과 같은 함수를 만드십시오.

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

그리고 전화

SELECT myrandom(100,300);

이것은 100에서 300 사이의 난수를 제공합니다.


3

FLOOR(RAND() * n) as randnum(n은 정수)를 사용하여 난수를 만들 수 있지만 동일한 난수를 반복 할 필요가 없다면 임시 테이블에 어느 정도 저장해야합니다. 그래서 당신은 그것을 확인할 수 있습니다 where randnum not in (select * from temptable)...


3

둘 다 잘 작동합니다.

select round(<maxNumber>*rand())

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

0

이것은의 정수 찾을 정확한 공식이다 ij어디i <= R <= j

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

3
이것은 잘못되었습니다. 절대 j (또는 최대)를 생성하지 않습니다. 숫자 i <= R <j를 생성합니다.
jlh

1
이어야합니다 :FLOOR(min+RAND()*(max-min+1))
David Rodrigues
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.