모듈:Random

리버티게임, 모두가 만들어가는 자유로운 게임
imported>Hsl0님의 2022년 6월 23일 (목) 20:05 판


모듈 설명문서[보기] [편집] [역사] [새로 고침]

난수를 다루는 lua함수를 모아둔 모듈입니다.

리버티위키를 비롯한 미디어위키 사이트는 구문분석기 캐싱이 허용되어 있기에 별도의 설정을 거치지 않으면 아무리 새로고침을 해도 같은값이 나오게끔 되어있습니다.

해당 모듈을 래핑하는 틀을 만들거나 {{#invoke:random}}를 사용하는 문서에 {{캐싱방지}}를 추가해주세요.

rand

이 부분의 본문은 틀:rand입니다.

choose

이 부분의 본문은 틀:choose입니다.

lotto

{{#invoke:random|lotto|a|b}}일 때, 1부터 b까지의 자연수 중 a개를 중복 없이 추출합니다.

사용법

파라미터별 설명

{{#invoke:random|lotto|추출할 표본수|전체갯수|추출할 보너스 갯수|표본 구분자|보너스 구분자|정렬 여부}}

파라미터 기본값

{{#invoke:random|lotto|6|45|1|, | + |true}}

예시

기본 예시

code_blocks 코드
{{#invoke:random|lotto}}
code
낙서장에서 확인
description 결과
스크립트 오류: 함수 "lotto"가 존재하지 않습니다.

보너스를 추출하지 않는 예시

code_blocks 코드
{{#invoke:random|lotto|||0}}
code
낙서장에서 확인
description 결과
스크립트 오류: 함수 "lotto"가 존재하지 않습니다.

0부터 10까지 숫자를 랜덤나열한 예시

code_blocks 코드
{{#invoke:random|lotto|10|10|0|-||false}}
code
낙서장에서 확인
description 결과
스크립트 오류: 함수 "lotto"가 존재하지 않습니다.

sample

가중치를 설정할 수 없고 문자열로 구분 가능한 choose입니다.

사용법

파라미터별 설명

{{#invoke:random|sample|텍스트|구분할 문자열}}

파라미터 기본값

{{#invoke:random|sample||,}}


예시

기본 예시

code_blocks 코드
{{#invoke:random|sample|1,2,3,4,5}}
code
낙서장에서 확인
description 결과
스크립트 오류: 함수 "sample"가 존재하지 않습니다.

구분자를 변경하는 예시

code_blocks 코드
{{#invoke:random|sample|1-2-3-4-5|-}}
code
낙서장에서 확인
description 결과
스크립트 오류: 함수 "sample"가 존재하지 않습니다.

특정 분류의 랜덤 게임을 출력하는 예시

code_blocks 코드
{{#invoke:random|sample|{{#dpl:|category=함정 피하기 게임|namespace|format=,%PAGE%//}}|//}}
code
낙서장에서 확인
description 결과
스크립트 오류: 함수 "sample"가 존재하지 않습니다.

id

원하는 길이의 무작위 문자열을 추출합니다. 문자열은 영어 대소문자, 숫자로 이루어져 있습니다.

local random = require('모듈:Random')

-- 6자리의 무작위 문자열 추출
random.id(6)

-- 시드를 1로 지정
random.id(6, 1)


local p = {}

function p.random(m, n, o)
	local seed, key
	
	if type(m) == "table" then
		seed = tonumber(m.seed)
		key = tonumber(m.key)
		m = nil
		n = nil
	elseif type(n) == "table" then
		seed = tonumber(n.seed)
		key = tonumber(n.key)
		m = tonumber(m)
		n = nil
	elseif type(o) == "table" then
		seed = tonumber(o.seed)
		key = tonumber(o.key)
		m = tonumber(m)
		n = tonumber(n)
	else
		m = tonumber(m)
		n = tonumber(n)
	end
	
	if (seed or 0) == 0 then
		seed = os.time() * ((key or 0) == 0 and os.clock() or key)
	elseif (key or 0) ~= 0 then
		seed = seed * key
	end
	
	math.randomseed(seed)
	
	if n ~= nil then
		return math.random(m, n)
	elseif m ~= nil then
		return math.random(m)
	else
		return math.random()
	end
end

function p.rand(frame)
	return p.random(frame.args[1], frame.args[2], frame.args)
end

function p.choose(frame)
	local len = 0
	
	for index, value in ipairs(frame.args) do
		len = index
	end
	
	return frame.args[p.random(len, frame.args)]
end

function p.chooseWrapped(frame)
	return p.choose(frame:getParent())
end

return p