etc./StackOverFlow

JavaScript에서 두 숫자 사이의 난수 생성

청렴결백한 만능 재주꾼 2021. 12. 2. 00:27
반응형

질문자 :Mirgorod


JavaScript에서 지정된 범위(예: 1에서 6: 1, 2, 3, 4, 5 또는 6)에서 난수를 생성하는 방법이 있습니까?



 function randomIntFromInterval(min, max) { // min and max included return Math.floor(Math.random() * (max - min + 1) + min) } const rndInt = randomIntFromInterval(1, 6) console.log(rndInt)

"추가"하는 것은 1로 시작하지 않는 임의의 간격을 허용한다는 것입니다. 따라서 예를 들어 10에서 15까지의 임의의 숫자를 얻을 수 있습니다. 유연성.


Francisc

중요한

다음 코드는 최소값이 '1'인 경우에만 작동합니다. '1' 이외의 최소값에는 작동하지 않습니다.

1(그리고 1만 )과 6 사이의 임의의 정수를 얻으려면 다음을 계산합니다.

 const rndInt = Math.floor(Math.random() * 6) + 1 console.log(rndInt)

어디에:

  • 1은 시작 번호입니다.
  • 6은 가능한 결과의 수입니다(1 + 시작 (6) - 끝 (1) )

khr055

Math.random()

min( included )과 max( included ) 사이의 정수 난수를 반환합니다.

 function randomInteger(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }

또는 min( 포함됨 )과 max( 포함되지 않음 ) 사이의 임의의 숫자 :

 function randomNumber(min, max) { return Math.random() * (max - min) + min; }

유용한 예(정수):

 // 0 -> 10 Math.floor(Math.random() * 11); // 1 -> 10 Math.floor(Math.random() * 10) + 1; // 5 -> 20 Math.floor(Math.random() * 16) + 5; // -10 -> (-2) Math.floor(Math.random() * 9) - 10;

** 그리고 항상 상기시켜 주시면 감사하겠습니다(Mozilla):

Math.random()은 암호학적으로 안전한 난수를 제공하지 않습니다. 보안과 관련된 어떤 용도로도 사용하지 마십시오. 대신 Web Crypto API를 사용하고 더 정확하게는 window.crypto.getRandomValues() 메소드를 사용하십시오.


Lior Elrom

기타 솔루션:

  • (Math.random() * 6 | 0) + 1
  • ~~(Math.random() * 6) + 1

온라인으로 시도


Vishal

TL;DR

 function generateRandomInteger(min, max) { return Math.floor(min + Math.random()*(max + 1 - min)) }

난수를 얻으려면 generateRandomInteger(-20, 20);

아래 설명

최소값과 최대값 사이의 임의의 정수, 예를 들어 X를 가져와야 합니다.

오른쪽?

최소 <= X <= 최대

방정식에서 min을 빼면 다음과 같습니다.

0 <= (X - 최소) <= (최대 - 최소)

이제 이것을 난수 r 과 곱해 보겠습니다.

0 <= (X - 최소) * r <= (최대 - 최소) * r

이제 방정식에 min 을 다시 추가해 보겠습니다.

최소 <= 최소 + (X - 최소) * r <= 최소 + (최대 - 최소) * r

이제 [min,max]와 같은 방정식 범위를 만족하는 r 을 생성하는 함수를 선택하겠습니다. 이것은 0<= r <=1인 경우에만 가능합니다.

좋아요. 이제 r ie [0,1]의 범위는 Math.random() 함수 결과와 매우 유사합니다. 그렇지 않아?

Math.random() 함수는 [0, 1) 범위의 부동 소수점 의사 난수를 반환합니다. 즉, 0(포함)에서 1(제외)까지(포함하지 않음)

예를 들어,

케이스 r = 0

min + 0 * ( max - min ) = 최소

경우 r = 1

min + 1 * ( max - min ) = 최대

Math.random 0 <= r < 1을 사용한 랜덤 케이스

min + r * ( max - min ) = X , 여기서 X 의 범위는 min <= X < max

위의 결과 X 는 임의의 숫자입니다. 그러나 Math.random()으로 인해 왼쪽 경계는 포괄적이고 오른쪽 경계는 배타적입니다. 오른쪽 경계를 포함하기 위해 오른쪽 경계를 1만큼 증가시키고 결과를 내립니다.

 function generateRandomInteger(min, max) { return Math.floor(min + Math.random()*(max + 1 - min)) }

난수를 얻으려면

generateRandomInteger(-20, 20) ;


Faiz Mohamed Haneef

또는 밑줄에서

 _.random(min, max)

vladiim

var x = 6; // can be any number var rand = Math.floor(Math.random()*x) + 1;

ryebr3ad

jsfiddle: https://jsfiddle.net/cyGwf/477/

Random Integer minmax 사이의 임의의 정수를 얻으려면 다음 코드를 사용하십시오.

 function getRandomInteger(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; }

임의의 부동 소수점 수 minmax 사이의 임의의 부동 소수점 수를 얻으려면 다음 코드를 사용하십시오.

 function getRandomFloat(min, max) { return Math.random() * (max - min) + min; }

참조: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random


Razan Paul

수학은 제 강점은 아니지만 양수와 음수 사이에 많은 난수를 생성해야 하는 프로젝트에서 작업했습니다.

 function randomBetween(min, max) { if (min < 0) { return min + Math.random() * (Math.abs(min)+max); }else { return min + Math.random() * max; } }

 randomBetween(-10,15)//or.. randomBetween(10,20)//or... randomBetween(-200,-100)

물론 숫자 이외의 다른 것으로는 이 작업을 수행하지 않도록 일부 유효성 검사를 추가할 수도 있습니다. 또한 최소값이 항상 최대값보다 작거나 같은지 확인하십시오.


Petter Thowsen

Francis의 코드에 기반한 ES6 / Arrow 함수 버전(즉, 최고 답변):

 const randomIntFromInterval = (min, max) => Math.floor(Math.random() * (max - min + 1) + min);

The Onin

정수뿐만 아니라 난수를 줄 수 있는 보다 유연한 함수를 작성했습니다.

 function rand(min,max,interval) { if (typeof(interval)==='undefined') interval = 1; var r = Math.floor(Math.random()*(max-min+interval)/interval); return r*interval+min; } var a = rand(0,10); //can be 0, 1, 2 (...) 9, 10 var b = rand(4,6,0.1); //can be 4.0, 4.1, 4.2 (...) 5.9, 6.0

고정 버전.


ElChupacabra

예시

1에서 10 사이의 난수를 반환합니다.

 Math.floor((Math.random() * 10) + 1);

결과는 다음과 같을 수 있습니다. 3

자신을 시도하십시오 : 여기

--

또는 lodash / undescore 사용:

_.random(min, max)

문서: - lodash - 밑줄 제거


Sebastián Lara

TypeScript로 작성된 난수 생성기를 검색하고 있었고 모든 답변을 읽은 후 이것을 작성했습니다. TypeScript 코더에서 작동하기를 바랍니다.

 Rand(min: number, max: number): number { return (Math.random() * (max - min + 1) | 0) + min; }

Erdi İzgi

이것은 음의 정수를 지원합니다.

 Math.floor(Math.random() * (max - min + 1)) + min;

Mike Christian

많은 답변과 거의 동일한 결과에도 불구하고. 내 답변을 추가하고 그 작동을 설명하고 싶습니다. 한 줄의 코드를 복사해서 붙여넣기 하는 것보다 동작을 이해하는 것이 중요하기 때문입니다. 난수를 생성하는 것은 단순한 수학일 뿐입니다.

암호:

 function getR(lower, upper) { var percent = (Math.random() * 100); // this will return number between 0-99 because Math.random returns decimal number from 0-0.9929292 something like that //now you have a percentage, use it find out the number between your INTERVAL :upper-lower var num = ((percent * (upper - lower) / 100)); //num will now have a number that falls in your INTERVAL simple maths num += lower; //add lower to make it fall in your INTERVAL //but num is still in decimal //use Math.floor>downward to its nearest integer you won't get upper value ever //use Math.ceil>upward to its nearest integer upper value is possible //Math.round>to its nearest integer 2.4>2 2.5>3 both lower and upper value possible console.log(Math.floor(num), Math.ceil(num), Math.round(num)); }

Arun Sharma

Math.random() 은 빠르고 많은 목적에 적합하지만 암호학적으로 안전한 값이 필요하거나(안전하지 않음) 완전히 균일한 편향되지 않은 분포의 정수가 필요한 경우(다른 답변에서 사용된 곱셈 접근 방식은 다음을 생성합니다. 특정 값은 다른 값보다 약간 더 자주 사용됨).

이러한 경우 crypto.getRandomValues() 를 사용하여 안전한 정수를 생성하고 대상 범위에 균일하게 매핑할 수 없는 생성된 값을 거부할 수 있습니다. 이것은 더 느리지만 매우 많은 수의 값을 생성하지 않는 한 중요하지 않아야 합니다.

편향된 분포 문제를 명확히 하기 위해 1과 5 사이의 값을 생성하려고 하지만 1과 16(4비트 값) 사이의 값을 생성하는 난수 생성기가 있는 경우를 고려하십시오. 각 출력 값에 매핑되는 동일한 수의 생성된 값을 원하지만 16은 5로 균등하게 나누지 않습니다. 나머지는 1을 남깁니다. 따라서 가능한 생성된 값 중 1개를 거부하고 다음을 얻을 때만 계속해야 합니다. 목표 범위에 균일하게 매핑할 수 있는 15개의 작은 값 중 하나입니다. 우리의 행동은 다음 의사 코드처럼 보일 수 있습니다.

 Generate a 4-bit integer in the range 1-16. If we generated 1, 6, or 11 then output 1. If we generated 2, 7, or 12 then output 2. If we generated 3, 8, or 13 then output 3. If we generated 4, 9, or 14 then output 4. If we generated 5, 10, or 15 then output 5. If we generated 16 then reject it and try again.

다음 코드는 유사한 논리를 사용하지만 32비트 정수를 대신 생성합니다. 이는 JavaScript의 표준 number 유형으로 나타낼 수 있는 가장 큰 공통 정수 크기이기 때문입니다. BigInt 를 사용하도록 수정할 수 있습니다.) 선택한 범위에 관계없이 거부되는 생성된 값의 비율은 항상 0.5 미만이므로 예상되는 거부 수는 항상 1.0 미만입니다. 일반적으로 0.0에 가깝습니다. 영원히 반복되는 것에 대해 걱정할 필요가 없습니다.

 const randomInteger = (min, max) => { const range = max - min; const maxGeneratedValue = 0xFFFFFFFF; const possibleResultValues = range + 1; const possibleGeneratedValues = maxGeneratedValue + 1; const remainder = possibleGeneratedValues % possibleResultValues; const maxUnbiased = maxGeneratedValue - remainder; if (!Number.isInteger(min) || !Number.isInteger(max) || max > Number.MAX_SAFE_INTEGER || min < Number.MIN_SAFE_INTEGER) { throw new Error('Arguments must be safe integers.'); } else if (range > maxGeneratedValue) { throw new Error(`Range of ${range} (from ${min} to ${max}) > ${maxGeneratedValue}.`); } else if (max < min) { throw new Error(`max (${max}) must be >= min (${min}).`); } else if (min === max) { return min; } let generated; do { generated = crypto.getRandomValues(new Uint32Array(1))[0]; } while (generated > maxUnbiased); return min + (generated % possibleResultValues); }; console.log(randomInteger(-8, 8)); // -2 console.log(randomInteger(0, 0)); // 0 console.log(randomInteger(0, 0xFFFFFFFF)); // 944450079 console.log(randomInteger(-1, 0xFFFFFFFF)); // Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295. console.log(new Array(12).fill().map(n => randomInteger(8, 12))); // [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9]


Jeremy

최고 등급의 솔루션은 그 아래의 주석과 같이 수학적으로 정확하지 않습니다. -> Math.floor(Math.random() * 6) + 1 .

작업: 1에서 6 사이의 난수를 생성합니다.

Math.random() 은 0에서 1 사이의 부동 소수점 숫자(예: 0.344717274374 또는 0.99341293123 Math.floor(Math.random() * 6) + 1 은 6의 일부 백분율을 반환합니다. (최대: 5, 최소: 0)에 1을 더합니다. 저자는 운 좋게 하한이 1. , 백분율 하한이 6 x 1보다 작은 5를 "최대로" 반환하고 1이 하한 1에 의해 추가되기 때문입니다.

문제는 하한이 1보다 클 때 발생합니다. 예를 들어, Task: 2와 6 사이에서 random을 생성 합니다.

(저자의 논리에 따름) Math.floor(Math.random() * 6) + 2 , 여기서 5 -> Math.random() * 6 얻은 다음 2를 더하면 결과는 7이 됩니다. 6의 원하는 경계를 넘어갑니다.

또 다른 예인 Task: 10 과 12 사이에서 무작위로 생성 합니다.

(저자의 논리에 따름) Math.floor(Math.random() * 12) + 10 , (반복해서 죄송합니다) 숫자 "12" 의 0%-99% 퍼센트를 얻고 있는 것이 분명합니다. 이는 원하는 것 이상으로 갈 것입니다. 12의 경계.

따라서 올바른 논리가 있기 때문에, 그것은 (1 빼줄 하한과 상한 추가 1 만 다음 층 사이의 차이를 가지고하는 것 Math.random() 방법은 전체 상한하지 얻을 수 있도록, 0.99를 먹으 렴 - 0 반환 (상한 + 1)의 최대 99%를 얻기 위해 상한에 1을 추가한 다음 초과분을 제거하기 위해 내립니다. (차이 + 1)의 바닥 백분율을 얻으면 하한을 추가하여 2개의 숫자 사이에서 원하는 임의의 숫자를 얻을 수 있습니다.

이에 대한 논리 공식은 Math.floor(Math.random() * ((up_boundary - low_boundary) + 1)) + 10 입니다.

추신: 사람들이 차이 에 1 을 추가하는 것을 잊었기 때문에 최고 평점 답변 아래에 있는 주석조차 부정확했습니다. 즉, 상위 경계를 얻지 못할 것입니다 (예, 전혀 얻고 싶지 않은 경우일 수 있지만 요구 사항은 상한을 포함하는 것이었습니다) .


M22

기본적으로 주사위처럼 1-6을 반환하려면,

 return Math.round(Math.random() * 5 + 1);

Husky931

@Francisc의 답변에서 int 버전을 기반으로 고정 정밀도 버전으로 float

 function randomFloatFromInterval (min, max, fractionDigits) { const fractionMultiplier = Math.pow(10, fractionDigits) return Math.round( (Math.random() * (max - min) + min) * fractionMultiplier, ) / fractionMultiplier }

그래서:

 randomFloatFromInterval(1,3,4) // => 2.2679, 1.509, 1.8863, 2.9741, ...

그리고 int 답변을 위해

 randomFloatFromInterval(1,3,0) // => 1, 2, 3

yonatanmn

이 함수는 최소값과 최대값 사이의 임의의 정수를 생성할 수 있습니다.

 function randomNumber(min, max) { if (min > max) { let temp = max; max = min; min = temp; } if (min <= 0) { return Math.floor(Math.random() * (max + Math.abs(min) + 1)) + min; } else { return Math.floor(Math.random() * (max - min + 1)) + min; } }

예시:

 randomNumber(-2, 3); // can be -2, -1, 0, 1, 2 and 3 randomNumber(-5, -2); // can be -5, -4, -3 and -2 randomNumber(0, 4); // can be 0, 1, 2, 3 and 4 randomNumber(4, 0); // can be 0, 1, 2, 3 and 4

Rayron Victor

재사용할 수 있는 random 함수를 사용합니다.

 function randomNum(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } randomNum(1, 6);

Okiemute Gold

이것은 작동해야 합니다:

 const getRandomNum = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min

Sabbir Ahmed

[a,b] 범위의 강력한 난수 정수(가정: a < b)

 let rand= (a,b)=> a+(b-a+1)*crypto.getRandomValues(new Uint32Array(1))[0]/2**32|0 console.log( rand(1,6) );


Kamil Kiełczewski

간단한 하나의 라이너:

 Math.floor( Math.random() * MAX_NUMBER ) + MIN_NUMBER

예:

 Math.floor( Math.random() * 6 ) + 1

Arun Joseph

이것은 약 9년이나 늦었지만 randojs.com 은 이것을 간단한 한 줄로 만듭니다.

 rando(1, 6)

이것을 html 문서의 머리 부분에 추가하기만 하면 되며, 임의성을 사용하여 원하는 모든 작업을 쉽게 수행할 수 있습니다. 배열의 임의 값, 임의의 jquery 요소, 개체의 임의 속성, 필요한 경우 반복 방지.

 <script src="https://randojs.com/1.0.0.js"></script>

Aaron Plocharczyk

다음을 사용해보십시오.

 function random(min, max) { return Math.round((Math.random() *( Math.abs(max - min))) + min); } console.log(random(1, 6));


AyushKatiyar

예제(1-6)에서와 같이 시작 번호가 1이면 Math.floor() 대신 Math.ceil() 메서드를 사용할 수 있습니다.

 Math.ceil(Math.random() * 6)

대신에

 Math.floor(Math.random() * 6) + 1

다른 유용한 수학 방법을 잊지 말자.


maxxx

ES6 기본 매개변수를 사용하여 이 작업을 수행하는 아주 새로운 방법을 발견했습니다. 하나의 인수 또는 두 개의 인수를 허용하기 때문에 매우 훌륭합니다. 여기있어:

 function random(n, b = 0) { return Math.random() * (bn) + n; }

maburdi94

이것은 저에게 효과적이며 Python의 random.randint 표준 라이브러리 함수와 같은 값을 생성합니다.

 function randint(min, max) { return Math.round((Math.random() * Math.abs(max - min)) + min); } console.log("Random integer: " + randint(-5, 5));

gnrfan

큰 숫자를 위해.

 var min_num = 900; var max_num = 1000; while(true){ let num_random = Math.random()* max_num; console.log('input : '+num_random); if(num_random >= min_num){ console.log(Math.floor(num_random)); break; } else { console.log(':::'+Math.floor(num_random)); } }

Ruthe

출처 : http:www.stackoverflow.com/questions/4959975/generate-random-number-between-two-numbers-in-javascript

반응형