본문으로 건너뛰기

randSentence

문장을 만들어 count개를 문자열로 돌려줍니다. 각 문장은 주어와 서술어로 이루어지며, 그 언어가 실제로 쓰는 방식으로 적힙니다. 한국어 명사에 붙는 조사, 이탈리아어 명사 앞의 관사, 독일어 동사가 지키는 두 번째 자리까지 그렇습니다. output: 'detail'을 주면 문자열 대신 사용한 구를 함께 알려 줍니다.

javascript
import { randSentence } from 'randino';

randSentence();
// ['The satin ranger dances in the plush harborside.']
dart
import 'package:randino/randino.dart';

randSentence();
// ['The satin ranger dances in the plush harborside.']
python
from randino import rand_sentence

rand_sentence()
# ['The satin ranger dances in the plush harborside.']

단어는 randWord가 뽑는 것과 같은 일상 어휘이며, 사람 이름은 쓰지 않습니다. 문장이 거기에 더하는 것은 문법입니다. 형태와 동사가 무엇을 어디에 세울지 정하는 방식은 문장에서 설명합니다.

옵션

모든 옵션은 선택 사항이며, 기본값은 위의 인자 없는 호출이 쓰는 값입니다.

옵션타입기본값설명
languageWordLanguageOptionWordLanguage?WordLanguageOption'all'null"all"생성할 문장의 언어. 'all'null"all"은 문장마다 하나씩 골라 모든 언어를 섞습니다.
themeWordThemeOptionWordTheme?WordThemeOption'all'null"all"문장의 주어가 무엇에 관한 것인지. 테마 참고.
typeSentenceTypeOptionSet<SentenceType>?SentenceTypeOption무작위문장이 무엇을 하는지. 문장의 종류 참고.
quoteSentenceQuoteSentenceQuote?SentenceQuote | NonenullNone인용된 문장이 어떤 따옴표를 쓸지. 대사와 생각 참고.
styleSentenceStyle무작위어느 화계로 쓸지. 화계 참고.
shapeSentenceShapeOptionSentenceShape?SentenceShapeOption'all'null"all"문장에 구를 몇 개 담을지. 문장에 담는 구의 개수 참고.
slotsSentenceSlotOptionSet<SentenceSlot>?SentenceSlotOption'all'null"all"주어 옆에 무엇을 두는지. 형태 고르기, 수량과 금액, 날짜와 시각 참고.
includestring | string[]List<String>str | Sequence[str]const []()모든 문장에 반드시 들어가야 할 단어. 반드시 넣을 단어 참고.
sentencesnumberintint1결과 하나에 담을 문장 수. 한 결과에 여러 문장 참고.
tenseSentenceTenseSentenceTense?SentenceTense | None무작위언제 일어난 일인지. 시제 참고.
storySentenceStorySentenceStory?SentenceStory | None무작위여러 문장짜리 결과가 어떤 이야기를 따를지. 한 결과에 여러 문장 참고.
includeNameincludeNameinclude_namebooleanboolbool무작위사람이 설 자리에 사람 이름을 씁니다. 사람 이름 참고.
countnumberintint1돌려줄 문장 개수. 010000으로 제한됩니다.
realismRandRealism<Lang js="'real'" dart="RandRealism.real" py="\"real\"" />real은 실제 단어를, invented는 그 언어처럼 읽히기만 하는 단어를 씁니다. mixed는 단어마다 정합니다. 문법은 어느 쪽이든 실제 그대로입니다.
vocabularyRandVocabulary<Lang js="'common'" dart="RandVocabulary.common" py="\"common\"" />명사가 얼마나 흔해야 하는지 정합니다. 주어, 목적어, 장소, 이야기의 물건이 모두 해당하며 basic, common, full 중 하나입니다. 문장은 읽히는 것이므로 따로 정하지 않으면 사람들이 쓰는 단어로 씁니다. 흔한 단어를 보세요.
minLengthminLengthmin_lengthnumberint?int | None언어문장 부호를 포함한 최소 글자 수.
maxLengthmaxLengthmax_lengthnumberint?int | None언어최대 글자 수.
startsWithstartsWithstarts_withstringString?strnull""이 글자로 시작하는 문장만 남깁니다. 그 글자를 쓰는 문자 체계의 언어에서만 뽑습니다. 관사를 쓰는 언어에서는 그 글자가 관사의 첫 글자입니다. 아래를 보세요.
uniquebooleanboolboolfalsefalseFalse같은 문장을 두 번 돌려주지 않습니다. count보다 적게 돌아올 수 있습니다.
outputRandOutputRandOutput'value'"value"문자열, 또는 문장마다 SentenceDetail 하나. Dart에는 이 옵션이 없습니다. 상세 출력 참고.
random() => numberRandom?Callable[[], float] | NonenullNone무작위성을 어디서 가져올지. 난수원 고르기를 보세요. 기본값은 각 언어의 일반 난수 생성기입니다.

두 길이 옵션은 다른 생성기가 쓰는 상한이 아니라 문장 하나당 RAND_SENTENCE_LENGTH_MAXrandSentenceLengthMaxRAND_SENTENCE_LENGTH_MAX으로 제한됩니다. 이름과 단어와 닉네임은 길어야 세 단어지만 문장은 여러 단어이고, 열 문장짜리 결과에는 그 열 배까지 허용됩니다.

모든 언어

javascript
randSentence({ language: 'ko', count: 3 });
// ['베이글은 짜다.', '커다란 조종사가 밀물에서 파란 요구르트를 굽는다.', '기상학자가 다시 톱을 닦는다.']

randSentence({ language: 'ja', count: 3 });
// ['さっき作業着が揺れる。', '昼に紫が派手な海王星で消える。', 'ハンバーガーが暗礁で冷める。']

randSentence({ language: 'zh', count: 3 });
// ['周末肉丸沸腾。', '巨乌贼又品尝朱红椰汁。', '明亮眼球总是移动。']

randSentence({ language: 'de', count: 3 });
// ['Eine junge Umlaufbahn fließt kaum.', 'Ein Nudelgericht kocht.', 'Eine Milz bebt.']

randSentence({ language: 'ru', count: 3 });
// ['Полый коньяк остывает.', 'Тимьян снова вянет.', 'Спутанный юпитер едва светлеет.']
dart
randSentence(language: WordLanguage.ko, count: 3);
// [베이글은 짜다., 커다란 조종사가 밀물에서 파란 요구르트를 굽는다., 기상학자가 다시 톱을 닦는다.]

randSentence(language: WordLanguage.ja, count: 3);
// [さっき作業着が揺れる。, 昼に紫が派手な海王星で消える。, ハンバーガーが暗礁で冷める。]

randSentence(language: WordLanguage.zh, count: 3);
// [周末肉丸沸腾。, 巨乌贼又品尝朱红椰汁。, 明亮眼球总是移动。]

randSentence(language: WordLanguage.de, count: 3);
// [Eine junge Umlaufbahn fließt kaum., Ein Nudelgericht kocht., Eine Milz bebt.]

randSentence(language: WordLanguage.ru, count: 3);
// [Полый коньяк остывает., Тимьян снова вянет., Спутанный юпитер едва светлеет.]
python
rand_sentence(language="ko", count=3)
# ['베이글은 짜다.', '커다란 조종사가 밀물에서 파란 요구르트를 굽는다.', '기상학자가 다시 톱을 닦는다.']

rand_sentence(language="ja", count=3)
# ['さっき作業着が揺れる。', '昼に紫が派手な海王星で消える。', 'ハンバーガーが暗礁で冷める。']

rand_sentence(language="zh", count=3)
# ['周末肉丸沸腾。', '巨乌贼又品尝朱红椰汁。', '明亮眼球总是移动。']

rand_sentence(language="de", count=3)
# ['Eine junge Umlaufbahn fließt kaum.', 'Ein Nudelgericht kocht.', 'Eine Milz bebt.']

rand_sentence(language="ru", count=3)
# ['Полый коньяк остывает.', 'Тимьян снова вянет.', 'Спутанный юпитер едва светлеет.']

아홉 언어 모두 지원하며, 문장 부호도 각자의 것을 씁니다. 일본어와 중국어는 로, 나머지는 .으로 끝납니다.

문장에 담는 구의 개수

shape는 문장에 구가 몇 개 들어갈지를 고릅니다. 예상 길이에 가장 가까운 옵션입니다. minLengthmaxLength가 글자 수를 정한다면 이쪽은 구의 개수를 정합니다.

javascript
randSentence({ language: 'en', shape: 'simple', count: 3 });
// ['The halftrack slides.', 'The pilsner is cold.', 'The blunt canoeing deepens.']

randSentence({ language: 'en', shape: 'detailed', count: 3 });
// ['At night, the oak spreads.', 'The wily steppe brightens quickly.', 'The sprig wilts in the wild sunspot.']

randSentence({ language: 'en', shape: 'complex', count: 3 });
// ['The cheerful naga shares the americano in the sandy steppe.', 'The crab counts the hockey in the planetarium.']
dart
randSentence(language: WordLanguage.en, shape: SentenceShape.simple, count: 3);
// [The halftrack slides., The pilsner is cold., The blunt canoeing deepens.]

randSentence(language: WordLanguage.en, shape: SentenceShape.detailed, count: 3);
// [At night, the oak spreads., The wily steppe brightens quickly.]

randSentence(language: WordLanguage.en, shape: SentenceShape.complex, count: 3);
// [The cheerful naga shares the americano in the sandy steppe.]
python
rand_sentence(language="en", shape="simple", count=3)
# ['The halftrack slides.', 'The pilsner is cold.', 'The blunt canoeing deepens.']

rand_sentence(language="en", shape="detailed", count=3)
# ['At night, the oak spreads.', 'The wily steppe brightens quickly.']

rand_sentence(language="en", shape="complex", count=3)
# ['The cheerful naga shares the americano in the sandy steppe.']

simple은 주어와 서술어뿐이고, detailed는 구가 하나 더 붙으며, complex는 둘 이상 붙습니다.

형태 고르기

slots주어 옆에 어떤 구가 올 수 있는지를 지정하며, 그중 아무것도 쓰지 않는 형태는 빠집니다. 하나라도 쓰면 통과하므로, 둘을 적으면 그중 아무거나 나오고 선택은 우연에 맡깁니다.

javascript
randSentence({ language: 'en', slots: 'object', count: 3 });
// ['The earthworm warms the nightcap.', 'The timid sorcerer builds the corduroy.']

randSentence({ language: 'en', slots: 'place', count: 3 });
// ['At dawn, the monorail sways in the bronze galaxy.', 'The cosmos darkens in the lunation.']

randSentence({ language: 'en', slots: 'state', count: 3 });
// ['The saffron is vague.', 'The weekend is dark.', 'The resolve is obvious.']

randSentence({ language: 'en', slots: 'none', count: 3 });
// ['The pearly hummus cools.', 'The litter passes.', 'The restless sleigh departs.']
dart
randSentence(language: WordLanguage.en, slots: {SentenceSlot.object}, count: 3);
// [The earthworm warms the nightcap., The timid sorcerer builds the corduroy.]

randSentence(language: WordLanguage.en, slots: {SentenceSlot.place}, count: 3);
// [At dawn, the monorail sways in the bronze galaxy.]

randSentence(language: WordLanguage.en, slots: {SentenceSlot.state}, count: 3);
// [The saffron is vague., The weekend is dark., The resolve is obvious.]

// 빈 집합이 다른 두 패키지의 `'none'`에 해당합니다.
randSentence(language: WordLanguage.en, slots: {}, count: 3);
// [The pearly hummus cools., The litter passes., The restless sleigh departs.]
python
rand_sentence(language="en", slots="object", count=3)
# ['The earthworm warms the nightcap.', 'The timid sorcerer builds the corduroy.']

rand_sentence(language="en", slots="place", count=3)
# ['At dawn, the monorail sways in the bronze galaxy.']

rand_sentence(language="en", slots="state", count=3)
# ['The saffron is vague.', 'The weekend is dark.', 'The resolve is obvious.']

rand_sentence(language="en", slots="none", count=3)
# ['The pearly hummus cools.', 'The litter passes.', 'The restless sleigh departs.']

형태는 언어마다 다르므로 모든 요청에 답할 수 있는 것은 아닙니다. 독일어에는 object가, 러시아어에는 place가 없습니다. 둘 다 명사의 어미가 바뀌는 격을 요구하는데 단어 풀은 형태를 하나씩만 담기 때문입니다. 그런 요청이 오면 그 언어가 가진 형태 전체에서 뽑습니다. 길이 범위가 너무 좁을 때 오류 대신 가장 가까운 결과를 주는 것과 같습니다.

javascript
randSentence({ language: 'de', slots: 'object', count: 3 });
// ['Im Frühling blüht eine Chrysantheme noch.', 'Eine neue Träne bebt.', 'Ein Kefir kühlt.']
dart
randSentence(language: WordLanguage.de, slots: {SentenceSlot.object}, count: 3);
// [Im Frühling blüht eine Chrysantheme noch., Eine neue Träne bebt., Ein Kefir kühlt.]
python
rand_sentence(language="de", slots="object", count=3)
# ['Im Frühling blüht eine Chrysantheme noch.', 'Eine neue Träne bebt.', 'Ein Kefir kühlt.']

언어를 지정하지 않으면 답할 수 있는 언어가 그렇지 못한 언어보다 먼저 뽑힙니다.

상태의 정도

degree는 상태 앞에 붙어 그 정도를 말하는 단어입니다. 무척, very, とても 같은 것들입니다. 모든 언어에 이것을 담는 형태가 있고, 상태가 취하는 계사는 그 앞으로 옮겨 갑니다. is very tired, está muy cansado처럼 적히므로, 상태문이 주어와 단어 하나로 끝나지 않고 더 자랄 자리가 생깁니다.

javascript
randSentence({ language: 'en', slots: 'degree', count: 3 });
// ['James is a little sated.', 'The valuation is terribly vague.', 'Orson is quite splendid.']

randSentence({ language: 'ko', slots: 'degree', count: 3 });
// ['상민은 엄청 졸리다.', '동욱은 퍽 건강하다.', '작은 홍옥은 조금 소중해.']
dart
randSentence(language: WordLanguage.en, slots: {SentenceSlot.degree}, count: 3);
// [James is a little sated., The valuation is terribly vague., Orson is quite splendid.]

randSentence(language: WordLanguage.ko, slots: {SentenceSlot.degree}, count: 3);
// [상민은 엄청 졸리다., 동욱은 퍽 건강하다., 작은 홍옥은 조금 소중해.]
python
rand_sentence(language="en", slots="degree", count=3)
# ['James is a little sated.', 'The valuation is terribly vague.', 'Orson is quite splendid.']

rand_sentence(language="ko", slots="degree", count=3)
# ['상민은 엄청 졸리다.', '동욱은 퍽 건강하다.', '작은 홍옥은 조금 소중해.']

어디로 가는지

destination은 주어가 향하는 곳이며, 어디론가 가는 동사만 이 구를 받습니다. 향한다, 들어선다, heads to, gets back to는 받고, leaves to the market 같은 문장은 나오지 않습니다. 시장이나 다락처럼 place 테마에서만 뽑고, 같은 부류인 하늘이나 행성에서는 뽑지 않습니다. 여우는 하늘 아래에서 잘 수는 있어도 하늘로 걸어갈 수는 없기 때문입니다. 이야기에서 주인공이 나설 때와 집에 돌아올 때 쓰는 구입니다.

javascript
randSentence({ language: 'en', slots: 'destination', count: 2 });
// ['The patient eagle returns to the attic.', 'The clever osprey goes to the promenade.']

randSentence({ language: 'ko', slots: 'destination', count: 2 });
// ['농부가 침실로 간다.', '공주가 가볍게 누각에 들어선다.']
dart
randSentence(language: WordLanguage.en, slots: {SentenceSlot.destination}, count: 2);
// [The patient eagle returns to the attic., The clever osprey goes to the promenade.]

randSentence(language: WordLanguage.ko, slots: {SentenceSlot.destination}, count: 2);
// [농부가 침실로 간다., 공주가 가볍게 누각에 들어선다.]
python
rand_sentence(language="en", slots="destination", count=2)
# ['The patient eagle returns to the attic.', 'The clever osprey goes to the promenade.']

rand_sentence(language="ko", slots="destination", count=2)
# ['농부가 침실로 간다.', '공주가 가볍게 누각에 들어선다.']

한국어는 여기서도 앞말에 따라 조사를 고릅니다. 복도로서울로, 그리고 아닌 받침 뒤에는 시장으로입니다. 독일어와 러시아어는 목적어와 장소가 없는 것과 같은 이유로 목적지 형태도 선언하지 않습니다.

수량과 금액

형태가 담을 수 있는 부분이 둘 더 있고, 다른 부분과 똑같이 slots로 요청합니다. quantity는 숫자와 수량사가 붙은 명사구이고, money는 금액과 그 언어가 돈을 세는 단위입니다.

javascript
randSentence({ language: 'ko', slots: 'quantity', count: 2 });
// ['파란 문어가 녹차 6개를 줍는다.', '파리가 감주 6개를 굽는다.']

randSentence({ language: 'vi', slots: 'quantity', count: 2 });
// ['Kỹ sư hẹp lau 7 cái thư.', '4 chiếc xe nôi chạy.']

randSentence({ language: 'en', slots: 'money', count: 2 });
// ['The silversmith describes 1,000 dollars.', 'The hollow magistrate remembers 500 dollars.']
dart
randSentence(language: WordLanguage.ko, slots: {SentenceSlot.quantity}, count: 2);
// [파란 문어가 녹차 6개를 줍는다., 파리가 감주 6개를 굽는다.]

randSentence(language: WordLanguage.vi, slots: {SentenceSlot.quantity}, count: 2);
// [Kỹ sư hẹp lau 7 cái thư., 4 chiếc xe nôi chạy.]

randSentence(language: WordLanguage.en, slots: {SentenceSlot.money}, count: 2);
// [The silversmith describes 1,000 dollars., The hollow magistrate remembers 500 dollars.]
python
rand_sentence(language="ko", slots="quantity", count=2)
# ['파란 문어가 녹차 6개를 줍는다.', '파리가 감주 6개를 굽는다.']

rand_sentence(language="vi", slots="quantity", count=2)
# ['Kỹ sư hẹp lau 7 cái thư.', '4 chiếc xe nôi chạy.']

rand_sentence(language="en", slots="money", count=2)
# ['The silversmith describes 1,000 dollars.', 'The hollow magistrate remembers 500 dollars.']

수량을 세는 언어는 수량사가 있는 넷뿐입니다. 어떤 수량사를 쓸지는 명사의 부류가 정합니다. 생물은 마리, 탈것은 , 나무는 그루입니다. 한국어와 일본어와 중국어는 숫자를 명사 뒤에 두고, 베트남어는 수량사까지 함께 앞에 둡니다.

언어수량금액
ko ja zh vi
en es it
de ru

영어와 스페인어와 이탈리아어는 수량을 세지 않습니다. 복수형 규칙을 적용하면 이 풀에서 12 sadnesses, 12 bacons, 12 goggleses가 나오기 때문입니다. 풀의 명사 대부분은 셀 수 없는 명사이고, 어느 것이 셀 수 있는지는 데이터 어디에도 적혀 있지 않습니다. 수량사가 있는 언어에는 그 문제가 없습니다. 슬픔 12가지는 열두 가지 슬픔이고, 추상명사를 셀 수 있게 만드는 것이 수량사이기 때문입니다.

독일어와 러시아어는 수량도 금액도 세지 않습니다. 금액은 목적어 자리에 서는데, 두 언어는 목적어 형태를 선언하지 않기 때문입니다. 명사가 제 어미를 바꾸는 격이 필요하다는, 목적어 형태를 두지 않은 것과 같은 이유입니다.

수량 명사구에는 관사도 수식어도 붙지 않습니다. the 12 red apples가 아니라 12 apples입니다. 천 단위 구분은 언어마다 다릅니다. 영어와 한국어와 일본어와 중국어는 ,를, 베트남어와 스페인어와 이탈리아어는 .을 씁니다.

숫자와 단위 사이도 언어마다 다릅니다. 한국어는 6개, 300,000원처럼 단위와 화폐를 숫자에 붙여 씁니다. 일본어와 중국어는 띄어쓰기가 없으니 마찬가지입니다. 베트남어와 영어와 스페인어와 이탈리아어는 6 con, 500 dollars처럼 띄어 씁니다.

날짜와 시각

문장이 담을 수 있는 부분이 둘 더 있습니다. date는 어느 날인지, clock은 몇 시인지를 나타내며, 둘 다 그 언어가 쓰는 방식으로 적힙니다.

javascript
randSentence({ language: 'ko', slots: 'date', count: 2 });
// ['2024년 5월 12일에 촉촉한 모래톱이 깊어지죠.', '비는 2027년 9월 19일입니다.']

randSentence({ language: 'en', slots: 'clock', count: 2 });
// ['At 13:24, the sherbet remains.', 'The torrent is at 3:26.']

randSentence({ language: 'de', slots: 'date', count: 2 });
// ['Ein Pokal ist am 9. November 2028.', 'Ein verworrenes Hockey ist am 7. März 2028.']
dart
randSentence(language: WordLanguage.ko, slots: {SentenceSlot.date}, count: 2);
// [2024년 5월 12일에 촉촉한 모래톱이 깊어지죠., 비는 2027년 9월 19일입니다.]

randSentence(language: WordLanguage.en, slots: {SentenceSlot.clock}, count: 2);
// [At 13:24, the sherbet remains., The torrent is at 3:26.]

randSentence(language: WordLanguage.de, slots: {SentenceSlot.date}, count: 2);
// [Ein Pokal ist am 9. November 2028., Ein verworrenes Hockey ist am 7. März 2028.]
python
rand_sentence(language="ko", slots="date", count=2)
# ['2024년 5월 12일에 촉촉한 모래톱이 깊어지죠.', '비는 2027년 9월 19일입니다.']

rand_sentence(language="en", slots="clock", count=2)
# ['At 13:24, the sherbet remains.', 'The torrent is at 3:26.']

rand_sentence(language="de", slots="date", count=2)
# ['Ein Pokal ist am 9. November 2028.', 'Ein verworrenes Hockey ist am 7. März 2028.']

날짜는 숫자만큼이나 어순의 문제입니다. 2026년 9월 5일은 큰 단위부터 쓰고, ngày 5 tháng 9 năm 2026은 반대 순서로 쓰면서 각 부분 앞에 단어를 붙이며, 5. September 2026은 달을 이름으로 부르고 일 뒤에 마침표를 찍습니다. 언어마다 자기 형식을 선언하고, 달을 이름으로 부르는 다섯 언어는 열두 이름을 함께 적습니다.

둘 다 설 수 있는 자리가 둘입니다. 부사구로 서거나(2026년 9월 5일에 사자가 달린다, On September 5, 2026, the lion runs), 문장이 주어를 그것과 같다고 놓는 자리에 섭니다(면접은 11시 40분이다., The match is at 11:40.).

뒤쪽은 계사문이며, 동사도 상태도 없는 유일한 문형입니다. 계사는 다른 서술어와 똑같이 다룹니다. 주어가 속할 수 있는 부류를 선언하고(어느 날에 일어나는 것은 사건이지 사자가 아닙니다), 화계와 서법이 요구하는 형태를 취합니다. 그래서 한국어는 이다, 이야, 이에요, 입니다를 쓰고 이니?로 묻습니다.

계사가 어디에 서는지는 언어가 정합니다. 한국어와 일본어는 대상 끝에 붙여 쓰므로 11시 40분이다가 한 단어입니다. 영어와 중국어와 베트남어와 스페인어와 이탈리아어와 독일어는 앞에 단어 하나로 세우고, 그 구가 원래 달고 있던 전치사도 그대로 둡니다. ist am 5. März처럼 씁니다.

러시아어는 calendar를 선언하지 않으므로, 요청하면 다른 처리 불가 요청과 마찬가지로 가장 가까운 형태로 물러납니다. 러시아어는 주어를 어느 날과 같다고 놓을 때 단어가 아니라 줄표를 쓰는데, 줄표는 의문이나 화계에 따라 변하지 않기 때문입니다.

반드시 넣을 단어

include에 적은 단어는 모든 문장에 한 번 이상 들어갑니다. 풀이 아는 단어는 제자리에 들어갑니다. 명사는 주어가 되고, 동사는 서술어가 되며, 부사는 방법을 나타내는 자리로 갑니다. 풀에 없는 단어는 명사로 씁니다.

javascript
randSentence({ language: 'en', include: 'lion', count: 3 });
// ['The genial lion finds the grumpy vest.', 'The noble lion is new.', 'The narrow lion crawls in the ancient pulsar.']

randSentence({ language: 'en', include: ['brave', 'lion', 'quietly'], count: 3 });
// ['The brave lion walks quietly.', 'The brave lion dozes quietly.', 'The brave lion swims quietly.']

randSentence({ language: 'ko', include: ['사자', '조용히'], count: 2 });
// ['눈꽃 사자가 조용히 뻔뻔한 토스터를 옮긴다.', '사자가 조용히 다가온다.']
dart
randSentence(language: WordLanguage.en, include: <String>['lion'], count: 3);
// [The genial lion finds the grumpy vest., The noble lion is new.]

randSentence(
  language: WordLanguage.en,
  include: <String>['brave', 'lion', 'quietly'],
  count: 3,
);
// [The brave lion walks quietly., The brave lion dozes quietly.]

randSentence(language: WordLanguage.ko, include: <String>['사자', '조용히'], count: 2);
// [눈꽃 사자가 조용히 뻔뻔한 토스터를 옮긴다., 사자가 조용히 다가온다.]
python
rand_sentence(language="en", include="lion", count=3)
# ['The genial lion finds the grumpy vest.', 'The noble lion is new.']

rand_sentence(language="en", include=["brave", "lion", "quietly"], count=3)
# ['The brave lion walks quietly.', 'The brave lion dozes quietly.']

rand_sentence(language="ko", include=["사자", "조용히"], count=2)
# ['눈꽃 사자가 조용히 뻔뻔한 토스터를 옮긴다.', '사자가 조용히 다가온다.']

한 단어가 여러 자리에 들어갈 수 있고, 어느 쪽이 될지는 나머지 단어에 달렸습니다. 영어 brave는 서술어로 문장을 끝맺기도 하고 명사구를 여는 수식어가 되기도 합니다. quietly와 함께 요청하면 수식어 자리를 잡습니다. 서술어로 형용사를 쓰는 형태에는 부사를 놓을 자리가 없기 때문입니다.

여기서 두 가지가 따라옵니다. 문장은 구의 개수만큼 단어를 담을 수 있으므로, 가장 긴 형태가 감당하는 것보다 많이 요청하면 들어가는 것만 넣고 나머지는 빠집니다. 그리고 language를 지정하지 않으면 적은 단어를 모두 가진 언어가 먼저 뽑히므로, include: '고양이'는 한국어 문장을 만듭니다.

문장의 종류

type은 문장이 무엇을 하는지 정합니다. 'statement', 'question', 'exclamation', 끝맺는 대신 멈추는 'trailing', 그리고 아래에서 설명하는 인용 두 가지입니다. 지정하지 않으면 문장마다 여섯 중 하나를 뽑고, 하나를 지정하거나 여러 개를 묶거나 'all'을 줄 수 있습니다.

이 뽑기는 고르지 않고 한쪽으로 기울어 있습니다. 실제 글이 그렇기 때문입니다. 평서문이 가장 많고 누군가 하는 말이 그다음이며, 의문과 감탄은 여섯 중 가장 드뭅니다. 종류를 직접 지정하면 그 종류만 나옵니다.

javascript
randSentence({ language: 'en', type: 'question', count: 2 });
// ['Does the delphinium spread in the halfmoon?', 'Does the evening brighten in the obelisk?']

randSentence({ language: 'ko', type: 'exclamation', count: 2 });
// ['저런, 두꺼운 황사가 깊어진다!', '오, 여름에 해뜰녘이 초원에서 짙어진다!']

randSentence({ language: 'ko', type: 'trailing', count: 2 });
// ['십종경기는 넓다…', '로켓이 반짝인다…']
dart
randSentence(language: WordLanguage.en, type: {SentenceType.question}, count: 2);
// [Does the delphinium spread in the halfmoon?, Does the evening brighten in the obelisk?]

randSentence(language: WordLanguage.ko, type: {SentenceType.exclamation}, count: 2);
// [저런, 두꺼운 황사가 깊어진다!, 오, 여름에 해뜰녘이 초원에서 짙어진다!]

randSentence(language: WordLanguage.ko, type: {SentenceType.trailing}, count: 2);
// [십종경기는 넓다…, 로켓이 반짝인다…]
python
rand_sentence(language="en", type="question", count=2)
# ['Does the delphinium spread in the halfmoon?', 'Does the evening brighten in the obelisk?']

rand_sentence(language="ko", type="exclamation", count=2)
# ['저런, 두꺼운 황사가 깊어진다!', '오, 여름에 해뜰녘이 초원에서 짙어진다!']

rand_sentence(language="ko", type="trailing", count=2)
# ['십종경기는 넓다…', '로켓이 반짝인다…']

의문문은 문장부호를 덧붙인 평서문이 아니라 그 자체로 하나의 형태입니다. 영어는 조동사가 주어 앞에 서는 형태를 선언하고 동사는 기본형으로 돌아갑니다. 독일어는 정동사를 비어 있는 첫 자리로 옮기고, 한국어는 서술어의 어미를 바꿉니다. 일본어와 중국어와 베트남어는 절 전체 뒤에 , , không 같은 꼬리표를 붙입니다.

언어어떻게 묻는가
endo-support, 그리고 그 뒤의 기본형Does the delphinium spread?
de정동사가 맨 앞으로Fliegt ein düsteres Kaninchen sorgsam?
ko서술어의 어미가 바뀜베고니아가 시드니?
ja zh vi절 뒤의 꼬리표侦探在遥远北极星里靠近吗?
es it ru문장부호만¿El vino vívido se estropea en la sabana?

마지막 줄의 세 언어에서는 의문문이 곧 평서문이므로, 의문형을 따로 선언하지 않고 평서형을 그대로 씁니다. 스페인어는 ¿¡로 양쪽 끝을 모두 표시합니다.

감탄문은 대개 감탄사로 시작합니다. 앞에 아무것도 없으면 문장부호만 바뀐 평서문과 다를 바가 없기 때문입니다. 평서문은 감탄사로 시작하지 않고, 의문문에는 이미 제 문장부호가 있습니다.

여러 타입을 요청하면 문장마다 정해집니다. 한 문단이 무언가를 묻고 스스로 답할 수 있다는 뜻이고, SentenceDetail.types가 각각 무엇이었는지 알려 줍니다.

javascript
randSentence({ language: 'en', type: 'all', sentences: 3 });
// ['Does the spectrum spread in the cosmic meteor? But does the copper rapture gather? The spectrum remains…']
dart
randSentence(language: WordLanguage.en, type: SentenceType.values.toSet(), sentences: 3);
// [Does the spectrum spread in the cosmic meteor? But does the copper rapture gather? The spectrum remains…]
python
rand_sentence(language="en", type="all", sentences=3)
# ['Does the spectrum spread in the cosmic meteor? But does the copper rapture gather? The spectrum remains…']

include로 지정한 단어는 타입이 요구하는 형태로 나옵니다. include: '달린다'type: 'question'이면 달린다?가 아니라 달리니?입니다. 각 형태를 평서형과 짝지어 저장해 두었기 때문에 이렇게 바꿔 쓸 수 있습니다.

화계

style은 문장을 어느 화계로 쓸지 정합니다. 한국어의 화계 그대로 네 단계입니다.

화계어떤 말투인가
'plain'해라체글의 목소리. 듣는 사람이 없습니다.
'casual'해체 (반말)가까운 사이에 하는 말.
'polite'해요체같은 거리에서 높여 말한 것. 넷 중 가장 다정합니다.
'formal'합쇼체높이되 거리를 둔 말.

지정하지 않으면 결과마다 하나를 뽑으므로, 두 번 호출하면 화계가 서로 다를 수 있습니다. 지정하면 그 결과의 모든 문장이 그 화계로 쓰입니다.

javascript
randSentence({ language: 'ko', style: 'plain', count: 2 });
// ['포도밭이 청량한 별자리에서 물든다.', '주먹이 저린다.']

randSentence({ language: 'ko', style: 'casual', count: 2 });
// ['계란은 고소해.', '노란 카멜레온이 찹쌀떡을 씹어.']

randSentence({ language: 'ko', style: 'polite', count: 2 });
// ['고래 6마리가 어슬렁대죠.', '체온이 떨려요.']

randSentence({ language: 'ko', style: 'formal', count: 2 });
// ['마차가 약국에서 흔들립니다.', '등산복이 서서히 반짝입니다.']
dart
randSentence(language: WordLanguage.ko, style: SentenceStyle.plain, count: 2);
// [포도밭이 청량한 별자리에서 물든다., 주먹이 저린다.]

randSentence(language: WordLanguage.ko, style: SentenceStyle.casual, count: 2);
// [계란은 고소해., 노란 카멜레온이 찹쌀떡을 씹어.]

randSentence(language: WordLanguage.ko, style: SentenceStyle.polite, count: 2);
// [고래 6마리가 어슬렁대죠., 체온이 떨려요.]

randSentence(language: WordLanguage.ko, style: SentenceStyle.formal, count: 2);
// [마차가 약국에서 흔들립니다., 등산복이 서서히 반짝입니다.]
python
rand_sentence(language="ko", style="plain", count=2)
# ['포도밭이 청량한 별자리에서 물든다.', '주먹이 저린다.']

rand_sentence(language="ko", style="casual", count=2)
# ['계란은 고소해.', '노란 카멜레온이 찹쌀떡을 씹어.']

rand_sentence(language="ko", style="polite", count=2)
# ['고래 6마리가 어슬렁대죠.', '체온이 떨려요.']

rand_sentence(language="ko", style="formal", count=2)
# ['마차가 약국에서 흔들립니다.', '등산복이 서서히 반짝입니다.']

화계는 어미만이 아니라 서법까지 바꿉니다. 해체와 해요체는 감탄형이 따로 없습니다. 달려는 묻는 말도 되고 하는 말도 되며 뒤에 붙는 문장부호만 다릅니다. 다만 물을 때만 어울리는 어미가 하나 있습니다. 달리지?달리죠?는 듣는 사람의 동의를 구하는 말이라, 두 화계는 서술문에 달려달려요를 쓰고 의문문에서만 두 어미 가운데 하나를 고릅니다. 해라체와 합쇼체는 형태가 서로 다르게 바뀝니다. 해라체는 -니, -나, -(으)ㄴ가로 묻고 -구나, -네, -군으로 감탄하며, 합쇼체는 달립니다달립니까로 바꿉니다.

javascript
randSentence({ language: 'ko', style: 'plain', type: 'question', count: 2 });
// ['치안판사가 귀여운 당김음을 닦나?', '발랄한 음료가 무지개 별무리에서 끓는가?']

randSentence({ language: 'ko', style: 'plain', type: 'exclamation', count: 2 });
// ['저런, 매콤한 목련이 뿌리내리는구나!', '저런, 어선이 귀여운 그림자에서 달리네!']
dart
randSentence(
  language: WordLanguage.ko,
  style: SentenceStyle.plain,
  type: {SentenceType.question},
  count: 2,
);
// [치안판사가 귀여운 당김음을 닦나?, 발랄한 음료가 무지개 별무리에서 끓는가?]

randSentence(
  language: WordLanguage.ko,
  style: SentenceStyle.plain,
  type: {SentenceType.exclamation},
  count: 2,
);
// [저런, 매콤한 목련이 뿌리내리는구나!, 저런, 어선이 귀여운 그림자에서 달리네!]
python
rand_sentence(language="ko", style="plain", type="question", count=2)
# ['치안판사가 귀여운 당김음을 닦나?', '발랄한 음료가 무지개 별무리에서 끓는가?']

rand_sentence(language="ko", style="plain", type="exclamation", count=2)
# ['저런, 매콤한 목련이 뿌리내리는구나!', '저런, 어선이 귀여운 그림자에서 달리네!']

한국어 의문형은 어미가 하나가 아니며, 풀의 항목이 그 어미들을 함께 적습니다. 형태 풀은 평서형과 자리를 맞춰 저장되므로 지정한 단어를 자리로 찾아 바꿀 수 있고, 한 항목이 |로 여러 어미를 담습니다. 달리니|달리나|달리는가는 동사 하나의 세 가지 어미이고, 문장마다 그중 하나가 뽑힙니다.

일본어는 두 단계뿐이라 네 단계에 나누어 맞춥니다. 'casual'은 보통체이고 'polite''formal'은 둘 다 走ります입니다. 묻는 일은 어느 화계에서든 가 맡습니다. 동사의 일부가 아니라 형태의 꼬리이기 때문입니다.

나머지 일곱 언어는 어느 화계에서도 같은 문장을 씁니다. 스페인어와 이탈리아어와 독일어와 러시아어에는 T–V 구분이 있지만 그것은 2인칭의 일이고, 여기 문장은 전부 3인칭입니다. el león corre는 상대가 누구든 같습니다. 영어에는 그런 형태가 아예 없습니다. 그래서 이 일곱은 화계를 선언하지 않으며, style은 아무것도 바꾸지 않습니다.

대사와 생각

'dialogue''thought'는 형태가 아니라 감싸는 방식입니다. 둘 다 문장을 그 언어의 따옴표로 감싸며, 감쌀 문장은 줄마다 새로 뽑습니다. 사람이 하는 말은 글보다 의문문의 비율이 높지만, 그래도 평서문이 더 많습니다.

javascript
randSentence({ language: 'en', type: 'dialogue', count: 2 });
// ['“The stout profit is endless!”', '“Does the blue intuition remain?”']

randSentence({ language: 'ja', type: 'dialogue', count: 2 });
// ['「組版工は速いか?」', '「芒が伸びるか?」']

randSentence({ language: 'ko', type: 'thought', count: 2 });
// ['‘대나무는 푸르다!’', '‘산뜻한 혜성은 밝니?’']
dart
randSentence(language: WordLanguage.en, type: {SentenceType.dialogue}, count: 2);
// [“The stout profit is endless!”, “Does the blue intuition remain?”]

randSentence(language: WordLanguage.ja, type: {SentenceType.dialogue}, count: 2);
// [「組版工は速いか?」, 「芒が伸びるか?」]

randSentence(language: WordLanguage.ko, type: {SentenceType.thought}, count: 2);
// [‘대나무는 푸르다!’, ‘산뜻한 혜성은 밝니?’]
python
rand_sentence(language="en", type="dialogue", count=2)
# ['“The stout profit is endless!”', '“Does the blue intuition remain?”']

rand_sentence(language="ja", type="dialogue", count=2)
# ['「組版工は速いか?」', '「芒が伸びるか?」']

rand_sentence(language="ko", type="thought", count=2)
# ['‘대나무는 푸르다!’', '‘산뜻한 혜성은 밝니?’']

따옴표는 언어마다 다릅니다. 대사는 1차 따옴표를, 생각은 2차 따옴표를 씁니다.

언어1차2차
en ko zh vi“…”‘…’
ja「…」『…』
es it«…»“…”
de„…“‚…‘
ru«…»„…“

중국어는 낫표가 아니라 굽은 따옴표를 씁니다. 이 풀은 간체자로 쓰여 있고, 가로쓰기 간체 중국어는 “”를 씁니다. 「」는 대만과 홍콩의 것입니다. 독일어는 아래에서 열고 위에서 닫기 때문에 짝이 대칭이 아닙니다.

quote는 타입과 무관하게 어느 따옴표를 쓸지 덮어씁니다. 생각을 1차 따옴표로, 대사를 2차 따옴표로 감쌀 수도 있습니다.

javascript
randSentence({ language: 'ru', type: 'thought', quote: 'double' });
// ['«Эх, беспокойный торт ненадолго кипит!»']
dart
randSentence(language: WordLanguage.ru, type: {SentenceType.thought}, quote: SentenceQuote.double);
// [«Эх, беспокойный торт ненадолго кипит!»]
python
rand_sentence(language="ru", type="thought", quote="double")
# ['«Эх, беспокойный торт ненадолго кипит!»']

인용 표지는 붙지 않습니다. …라고 그는 말했다를 쓰려면 말한 사람과 말하는 동사가 있어야 하는데, 사람은 includeName이 붙여 주지만 말하는 동사는 아홉 언어 어느 풀에도 없습니다. 돌려받는 것은 대사 자체이고, 누가 말했는지는 담기지 않습니다.

시제

tense는 언제 일어난 일인지를 정합니다. 'present'SentenceTense.present"present" 또는 'past'SentenceTense.past"past"입니다. 지정하지 않으면 결과마다 뽑으므로, 한 문단은 첫 문장부터 마지막 문장까지 한 시제로 쓰입니다.

javascript
randSentence({ language: 'en', tense: 'past', count: 3 });
// ['The prosecutor looked around.', 'The impala missed 500 dollars.', '“Was the karst dark?”']

randSentence({ language: 'ko', tense: 'past', count: 3 });
// ['친절한 약사는 뿌듯했다.', '가벼운 무인기가 달렸다.', '아침에 게으른 좀비가 신선한 온수를 마셨다.']
dart
randSentence(language: WordLanguage.en, tense: SentenceTense.past, count: 3);
// [The prosecutor looked around., The impala missed 500 dollars., “Was the karst dark?”]

randSentence(language: WordLanguage.ko, tense: SentenceTense.past, count: 3);
// [친절한 약사는 뿌듯했다., 가벼운 무인기가 달렸다., 아침에 게으른 좀비가 신선한 온수를 마셨다.]
python
rand_sentence(language="en", tense="past", count=3)
# ['The prosecutor looked around.', 'The impala missed 500 dollars.', '“Was the karst dark?”']

rand_sentence(language="ko", tense="past", count=3)
# ['친절한 약사는 뿌듯했다.', '가벼운 무인기가 달렸다.', '아침에 게으른 좀비가 신선한 온수를 마셨다.']

과거형은 언어마다 자기 문법대로 씁니다. 규칙으로 추측하지 않고 단어 풀에 형태를 직접 담아 둡니다.

언어무엇이 바뀌는지
en동사, 그리고 의문문의 조동사The lion ran., Did the lion run?
ko ja어미. 모든 화계에서 바뀝니다달렸다, 달렸어요, 走った, 走りました
es it동사. 형용사는 그대로 두고 앞의 동사(copula)가 바뀝니다El cochero guardó la pantufla., Il carro scivolò.
de동사Ein Smoothie kochte.
ru동사. 주어의 성에 따라 일치합니다Берёза тянулась., Паланкин скользил.
zh동사는 그대로, 뒤에 를 씁니다峡谷悄悄地沉寂了。
vi동사는 그대로, 앞에 đã를 씁니다Đại bàng đã tìm quanh.

시간 부사어도 시제를 따릅니다. 어제yesterday는 과거 문장만 열고, 내일tomorrow는 현재 문장만 열며, 하루의 때는 어느 쪽에도 옵니다.

include에 서술형으로 적은 단어는 의문문으로 옮기듯 과거형으로도 옮깁니다. include: '달린다'tense: 'past'를 주면 달렸다가 쓰이고, include: 'runs'ran이 됩니다. 결과가 어느 시제로 쓰였는지는 SentenceDetail.tense가 알려 줍니다.

한 결과에 여러 문장

sentences는 결과 하나에 문장을 여러 개 담습니다. 결과는 문자열 하나이고, 문자열이 몇 개인지는 count가 정합니다. 담기는 문장들은 따로 뽑은 것이 아니라 하나의 짧은 이야기입니다.

javascript
randSentence({ language: 'en', sentences: 3, count: 2 });
// ['On weekends, the barkeep went to the empty hallway. The barkeep bought the sushi in the hallway. The barkeep came back to the cottage.',
//  'The cathedral brightens. The strange botanist comes back to the pavilion and nods off. At dawn, the cathedral fills up.']

randSentence({ language: 'ko', sentences: 3 });
// ['신비한 항해사가 옥상으로 향했다. 고요한 옥상에서 묵묵히 향긋한 미트볼을 사왔다. 집에 들어섰다.']
dart
randSentence(language: WordLanguage.en, sentences: 3, count: 2);
// [On weekends, the barkeep went to the empty hallway. The barkeep bought the sushi in the hallway. The barkeep came back to the cottage.,
//  The cathedral brightens. The strange botanist comes back to the pavilion and nods off. At dawn, the cathedral fills up.]

randSentence(language: WordLanguage.ko, sentences: 3);
// [신비한 항해사가 옥상으로 향했다. 고요한 옥상에서 묵묵히 향긋한 미트볼을 사왔다. 집에 들어섰다.]
python
rand_sentence(language="en", sentences=3, count=2)
# ['On weekends, the barkeep went to the empty hallway. The barkeep bought the sushi in the hallway. The barkeep came back to the cottage.',
#  'The cathedral brightens. The strange botanist comes back to the pavilion and nods off. At dawn, the cathedral fills up.']

rand_sentence(language="ko", sentences=3)
# ['신비한 항해사가 옥상으로 향했다. 고요한 옥상에서 묵묵히 향긋한 미트볼을 사왔다. 집에 들어섰다.']

문장들은 이야기를 따릅니다. 주인공 한 명에게 일어나는 일을 앞뒤가 맞는 순서로 적는 것입니다. 이야기의 각 단계는 그 전에 주인공이 어떤 상태여야 하고 그 뒤에 어떤 상태가 되는지를 적어 두므로, 먹을 것을 구하기 전에 먹는 일도, 나갔다가 돌아오지 않고 잠드는 일도 없습니다. 이야기에 꼭 필요한 단계는 언제나 들어가고, 나머지는 남은 문장 수만큼 채우며, 들어갈 자리가 없는 단계는 억지로 넣지 않고 뺍니다.

이야기무슨 일이 일어나는지
errand주인공이 어딘가로 가서 먹을 것을 사거나 찾고, 집에 가져와 먹습니다.
meal주인공이 배고파서 먹을 것을 꺼내 먹고 배가 찹니다.
search주인공이 어딘가를 살펴 물건을 찾아내고, 집에 가져와 간직합니다.
outing주인공이 일어나 밖으로 나가 하루를 보내고, 지쳐 돌아와 쉽니다.
craft사람이 물건을 만들어 손질하고, 팔거나 건네고 만족합니다.
stroll주인공이 어딘가로 가서 거닐다 집에 돌아옵니다.
evening장소가 조용해지고, 주인공이 집에 돌아와 먹고, 피곤해져 잠듭니다.
chores사람이 일어나 물건을 꺼내 손질하고 만족합니다.
stash주인공이 물건을 어딘가로 가져가 숨기고 집에 돌아옵니다.
idle주인공이 집에서 할 일 없이 기다리다 놀고 만족합니다.
waking장소가 주인공보다 먼저 깨어나고, 주인공이 일어나 하루를 시작합니다.
picnic주인공이 어딘가로 가서 먹을 것을 구하고, 그 자리에서 먹습니다.
mishap주인공이 들고 간 물건을 어딘가에서 잃어버려 찾아다니고, 찾기도 하고 못 찾기도 합니다.
visit주인공이 어딘가로 가서 누군가를 만나 이야기를 나눕니다.
chat사람이 밖으로 나가 누군가를 만나고, 둘이서 이야기를 주고받습니다. 대사가 가장 많은 이야기입니다.
watch주인공이 밖으로 나가 어딘가에 앉아, 주변에서 일어나는 일을 지켜봅니다. 참새 한 마리, 지나가는 사람, 바뀌는 빛 같은 것들입니다.
shelter주인공이 나가 있는 동안 날씨가 바뀌고, 지나가기를 기다렸다가 다시 움직입니다.
sketch누구에게도 아무 일이 일어나지 않습니다. 장소를 묘사하고, 그 안의 것들이 제 할 일을 합니다. 바람, 나뭇잎, 새, 저녁 같은 것들입니다.
passage사물이나 식물이나 장소가 하루 동안 변해 가고, 아무도 무엇을 하지 않습니다.

story는 이 가운데 하나를 지정합니다. 지정하지 않으면 요청한 주어에 대해 그 언어가 들려줄 수 있는 이야기 중에서 뽑습니다. 주인공이 누구인지는 theme이 정하므로 theme: 'animal'은 사자 이야기가 되고, theme: 'plant'passage만 될 수 있습니다. 독일어와 러시아어는 목적어가 있는 형태를 선언하지 않으므로 주인공이 아무것도 들지 않는 이야기만 들려줍니다. stroll, outing, evening, idle, waking, watch, shelter, sketch, passage입니다. 문장 하나짜리 결과는 이야기가 없고, 여러 문장짜리 결과가 어느 이야기를 따랐는지는 SentenceDetail.story가 알려 줍니다.

이야기의 모든 문장이 주인공에 관한 것은 아닙니다. 대부분의 이야기에는 다른 누군가가 등장해 제 일을 합니다. 만난 사람, 노점 상인, 담장 위의 새, 날씨 같은 것들이고, 이름이 아니라 그것이 무엇인지로 적습니다. 누군가 말을 하는지도 결과마다 정합니다. 처음부터 끝까지 서술만 할 수도 있고, 한두 줄을 인용할 수도 있고, 대화 장면이 될 수도 있습니다. 대화 장면에서는 대답을 들은 주인공이 말을 이어가므로 몇 줄이 오갑니다. 대사는 다섯 가지 중 하나입니다. 사람이 자기 상태나 방금 한 일을 1인칭으로 말합니다(“배고파요.”, “시장에 가서 빵을 샀어.”). 두 절로 된 문장은 두 절 모두 주인공이 말할 수 있는 일이면 한 줄의 대사가 되며, 그 언어가 1인칭을 쓸 수 있을 때에 한합니다. 눈앞의 사물이나 주변 장소를 두고 3인칭으로 말합니다(“사과가 참 달다!”, «El hospital es precioso.»). 이것은 모든 언어가 쓸 수 있습니다. 다른 누군가가 하는 일을 보이는 대로 말합니다(“새가 날아가네!”). 옆에 있는 사람에 관한 것이라면 면전에서 말하지 않고 생각으로 적습니다. 옆에 있는 사람에게 괜찮은지 2인칭으로 묻습니다(“배고파?”, “Are you tired?”, ¿Estás cansado?). 이것도 모든 언어가 씁니다. 마지막으로 누군가가 앞의 대사에 그 언어의 대답으로 응답합니다. 집에 돌아오는 것만은 보고하지 않고 그 언어의 관용구로 말합니다(“다녀왔습니다.”, 「ただいま」, “I'm home.”). 관용구에는 1인칭이 필요 없으므로 모든 언어가 씁니다. 대답은 앞말에 맞춥니다. “그러게.”는 감상에, “잘됐다!”는 소식에, “괜찮아?”는 피곤하다는 말에 따라오고, “정말?”은 더 묻고, “응, 조금.”은 질문에 답합니다. 대답은 어떤 구로도 만들어지지 않으므로 SentenceDetail.phrases에는 아무것도 들어가지 않고, 한 결과의 대사는 모두 같은 화계로 말합니다.

javascript
randSentence({ language: 'ko', sentences: 4, story: 'errand', tense: 'past' });
// ['낙타가 터미널로 갔다. 게다가 고요한 터미널에서 사뿐히 신선한 냉면을 봤다. 얼마뒤 냉면을 꺼내고 부리나케 집에 다다랐다. 한낮에 냉면을 먹었다.']

randSentence({ language: 'en', sentences: 4, story: 'meal', includeName: true });
// ['Zoe was starving. Therefore she picked the crisp ceviche. She nibbled the crisp ceviche alone. In the morning, she shouted.']
dart
randSentence(language: WordLanguage.ko, sentences: 4, story: SentenceStory.errand, tense: SentenceTense.past);
// [낙타가 터미널로 갔다. 게다가 고요한 터미널에서 사뿐히 신선한 냉면을 봤다. 얼마뒤 냉면을 꺼내고 부리나케 집에 다다랐다. 한낮에 냉면을 먹었다.]

randSentence(language: WordLanguage.en, sentences: 4, story: SentenceStory.meal, includeName: true);
// [Zoe was starving. Therefore she picked the crisp ceviche. She nibbled the crisp ceviche alone. In the morning, she shouted.]
python
rand_sentence(language="ko", sentences=4, story="errand", tense="past")
# ['낙타가 터미널로 갔다. 게다가 고요한 터미널에서 사뿐히 신선한 냉면을 봤다. 얼마뒤 냉면을 꺼내고 부리나케 집에 다다랐다. 한낮에 냉면을 먹었다.']

rand_sentence(language="en", sentences=4, story="meal", include_name=True)
# ['Zoe was starving. Therefore she picked the crisp ceviche. She nibbled the crisp ceviche alone. In the morning, she shouted.']

이야기가 한 번 꺼낸 것은 끝까지 그대로입니다. 주인공이 찾은 물건이 집에 가져와 먹는 물건이고, 간 곳이 둘러보는 곳이며, 집은 집입니다. 여기에 두 가지 변화가 있습니다. 이야기는 중심이 되는 물건 옆에 둘째 물건을 둘 수 있습니다. 만들기 전에 집어 드는 연장, 좌판이나 방 안에서 바라보는 무언가인데, 이야기에 꼭 필요한 것은 아니어서 빠질 수도 있습니다. 그리고 이야기는 자리를 옮길 수 있습니다. stroll, outing, search, picnic은 도중에 다른 곳으로 갈 수 있고, 그 뒤로는 그곳이 이야기의 장소가 됩니다. 뒤 문장은 관사를 새로 쓰되 수식어는 다시 붙이지 않으므로, 안개 나루터에서나루터에서가 되기는 해도 조용한 나루터에서금고에서가 되지는 않습니다. 앞 문장이 부른 물건은 다시 부르지 않고 가리킵니다. 이어진 문장의 뒤 절은 늘 그렇게 하고(끓여서 먹었다, cooked the sausage and ate it), 온전한 문장은 주어를 다시 부르는 정도의 빈도로 그렇게 합니다. 가리키는 방식은 언어마다 다릅니다. 한국어와 일본어와 중국어와 베트남어는 목적어를 생략하고, 영어는 it, 러시아어는 егоеё를 쓰며, 스페인어와 이탈리아어는 동사 앞에 접어를 붙이고(la comió), 독일어는 명사를 다시 부릅니다. 주인공은 첫 문장에서 이름을 부르고, 그 뒤로는 문단이 주어를 가리키는 방식대로 다시 부르거나 대명사를 세우거나, 주어를 생략하는 언어라면 생략합니다. 주어가 주인공이 아닌 문장은 장면이 바뀌는 문장 하나입니다. 우체국이 서서히 조용해졌다., The cathedral brightens.처럼 이야기가 벌어지는 장소가 주어가 됩니다.

하루는 앞으로만 흐릅니다. 새벽에로 연 이야기는 아침에한낮에로 이어지고 다시 새벽으로 돌아가지 않으며, 부르는 때와 때 사이는 하루가 아니라 몇 시간입니다.

이웃한 두 단계는 때로 한 문장이 됩니다. 뒤 절은 주어 없이 씁니다. 사원에서 멈춰서고 천천히 집에 들어섰다, The broker heads back to the cottage and leans warily, 記念館へ下りる。のんびり家に帰り着いてさらりともたれる。처럼 됩니다. 두 절을 어떻게 잇는지는 언어가 선언합니다. 한국어는 앞 동사의 -고, 영어는 and, 일본어는 -て이고, 독일어는 선언하지 않아 절을 잇지 않습니다. 이음새도 다른 요소와 같이 길이 범위에서 값을 치르므로, 좁은 범위에서는 짧은 두 문장이 되고 넓은 범위에서는 긴 한 문장이 됩니다.

사람은 이따금 말을 합니다. 사람이 배고프다거나 피곤하다거나 기쁘다는 상태문은 때때로 서술 대신 그 사람이 말하거나 생각하는 대사가 됩니다. “배고파.”, ‘I am tired.’, 「くたくたです!」처럼 따옴표 안에 1인칭으로, 이야기의 말투와 상관없이 사람이 말하는 높임으로 씁니다. 첫 문장은 대사가 되지 않고 한 결과에 두 번을 넘지 않으며, 술어를 바꾸지 않고 1인칭을 쓸 수 있는 한국어, 일본어, 중국어, 베트남어, 영어에서만 나옵니다. 동물은 서술만 하고, 스페인어와 이탈리아어와 독일어와 러시아어에서는 모두가 서술만 합니다. type을 지정하면 대사 대신 지정한 종류가 나옵니다.

주어가 사람 이름일 때는 다릅니다. 민준으로 시작한 문단은 이름을 다시 부르거나 그 자리에 대명사를 세울 뿐, 같은 부류의 다른 사람을 뽑지 않습니다. 그랬다가는 문단이 도중에 다른 사람 이야기가 되기 때문입니다.

수식어는 꾸미는 명사에 맞게 고릅니다. 음료는 뜨거운, 맑은, 향긋한이고 정비사는 친절한이나 조용한이어서, 맑은 정비사the patient tea는 나오지 않습니다. 이야기 안에서만이 아니라 문장 하나에서도 그렇습니다.

어투도 처음 것을 지킵니다. 서술로 연 문단에는 대사가 섞이지 않고, 인용으로 연 문단은 대사 사이에 서술이 들어갑니다. 한 사람이 내리 네 마디를 하면 그동안 벌어진 일이 통째로 빠지기 때문입니다. 사이에 들어가는 서술은 묻지 않고 말합니다. 물으면 두 사람뿐인 장면에 제3의 목소리가 끼어들게 됩니다.

접속사는 앞 문장에 대해 무엇을 주장하는지 표시해 두고 씁니다. 네 종류 가운데 시간이 흘렀다, 하나 더 있다, 그것과 반대다에 해당하는 셋은 어떤 문장 뒤에도 올 수 있습니다. 나머지 하나는 다릅니다. 그러므로, 그래서, so, だから는 이 문장이 앞 문장에서 비롯된다고 말하므로, 두 문장이 같은 것을 다루고 이 문장이 묻는 대신 말할 때만 쓸 수 있습니다. 프레첼 이야기 뒤에 그러므로 금빛 하이볼이 식죠?가 오면 아무것도 뒤따르지 않는 결과가 됩니다.

주장한국어영어일본어
하나 더그리고, 게다가and then, besidesそして, また
시간이 흘렀다이윽고, 마침내meanwhile, laterやがて, その後
그것과 반대하지만, 그러나but, howeverしかし, けれども
그래서그래서, 그러므로so, thereforeだから, そこで

이야기에서는 접속사를 이야기가 고릅니다. 먹을 것을 찾은 뒤에 먹는 것처럼 앞 단계에서 비롯되는 단계는 그래서so로 열 수 있고, 그저 다음에 오는 단계는 이윽고later로 열거나 아무것도 없이 시작합니다.

언어는 자기가 쓸 수 있는 종류만 선언합니다. 독일어에는 시간을 나타내는 접속사가 없습니다. danndanach는 부사인데, 부사가 첫 자리에 서면 정동사가 자리를 옮기므로 절을 열 수 있는 것은 등위접속사 다섯 개뿐입니다.

한 문단은 같은 것을 두 번 하지 않습니다. 바로 앞 문장과 같은 종류는 되풀이될수록 확률이 낮아지므로 의문문이 줄줄이 이어지다 저절로 끊깁니다. 동사 무리는 한 바퀴 다 쓰고 나서야 다시 쓰므로 네 문장 중 셋이 같은 서술어로 끝나는 일이 없습니다. 사람 이름은 한 번 부르고 나면 한동안 부르지 않고, 새로 뽑는 주어는 부류 전체가 아니라 화제와 같은 테마에서 주로 나옵니다. 같은 접속사나 감탄사로 두 문장을 여는 일도 없습니다.

대명사를 어떻게 쓸지는 언어마다 다릅니다. 영어는 it을 쓰고, 한국어와 일본어와 중국어와 스페인어와 이탈리아어는 두 번째 문장에서 실제로 그러듯 주어를 생략합니다. 독일어와 러시아어는 명사의 성에 따라 고릅니다. 사람을 가리킬 수 없는 대명사만 있는 언어는 대신 화제를 다시 부릅니다. 영어의 heshe는 단어 풀에 없는 성을 요구하고, 그것それ는 무생물을 가리키기 때문입니다.

이름은 예외입니다. 성별을 지닌 주어는 이름뿐이기 때문입니다. Philip counts the prime. He forgets it in the supernova.처럼, the locksmith였다면 다시 부를 수밖에 없던 자리에 영어는 he를 세웁니다. 성별 대명사가 없는 언어는 그대로여서, 한국어는 사람을 두고 그것이라 하는 대신 주어를 생략합니다.

길이 범위는 문장 수와 무관하게 문자열 전체를 가리킵니다. 어느 문장을 뽑기 전에 범위를 나눠 갖고, 남는 몫은 마지막 문장이 가져갑니다.

javascript
randSentence({ language: 'ko', sentences: 3, minLength: 40, maxLength: 55 });
// ['집사가 골방으로 향했다. 그러자 어두운 골방에서 물을 샀다. 집사가 집에 들어왔다.'] // 44자
dart
randSentence(language: WordLanguage.ko, sentences: 3, minLength: 40, maxLength: 55);
// [집사가 골방으로 향했다. 그러자 어두운 골방에서 물을 샀다. 집사가 집에 들어왔다.] // 44자
python
rand_sentence(language="ko", sentences=3, min_length=40, max_length=55)
# ['집사가 골방으로 향했다. 그러자 어두운 골방에서 물을 샀다. 집사가 집에 들어왔다.']  # 44자

include에 적은 단어는 첫 문장에 들어갑니다. 문장마다 한 번씩이 아니라 결과마다 한 번씩 넣기 위해서입니다. sentencesRAND_SENTENCE_COUNT_MAXrandSentenceCountMaxRAND_SENTENCE_COUNT_MAX인 10으로 제한됩니다.

사람 이름

다른 생성기는 사람 이름을 일부러 피합니다. 닉네임을 사람 이름으로 만들지 않는다는 규칙이 이름과 단어를 갈라 둔 이유입니다. 문장만 예외입니다. includeNameincludeNameinclude_name은 문장에 사람이 설 자리가 있을 때 생성한 이름을 씁니다.

지정하지 않으면 결과마다 절반의 확률로 정합니다. 문장 단위가 아니라 결과 단위인 것은, 한 문단에 사람이 나오거나 나오지 않거나 둘 중 하나이기 때문입니다. 직접 지정하면 그 값이 그대로 쓰입니다.

javascript
randSentence({ language: 'en', includeName: true, count: 3 });
// ['Callum drinks the round rye.', 'Gavin crawls.', 'Veronica paints the plunger neatly.']

randSentence({ language: 'ko', includeName: true, count: 3 });
// ['소한이 날아오른다.', '종현이 심벌즈를 판다.', '은영이 어슬렁댄다.']

randSentence({ language: 'es', includeName: true, count: 3 });
// ['Hilario imagina la duda.', 'Adrián calienta la uva redonda.', 'Santiago rueda.']
dart
randSentence(language: WordLanguage.en, includeName: true, count: 3);
// [Callum drinks the round rye., Gavin crawls., Veronica paints the plunger neatly.]

randSentence(language: WordLanguage.ko, includeName: true, count: 3);
// [소한이 날아오른다., 종현이 심벌즈를 판다., 은영이 어슬렁댄다.]

randSentence(language: WordLanguage.es, includeName: true, count: 3);
// [Hilario imagina la duda., Adrián calienta la uva redonda., Santiago rueda.]
python
rand_sentence(language="en", include_name=True, count=3)
# ['Callum drinks the round rye.', 'Gavin crawls.', 'Veronica paints the plunger neatly.']

rand_sentence(language="ko", include_name=True, count=3)
# ['소한이 날아오른다.', '종현이 심벌즈를 판다.', '은영이 어슬렁댄다.']

rand_sentence(language="es", include_name=True, count=3)
# ['Hilario imagina la duda.', 'Adrián calienta la uva redonda.', 'Santiago rueda.']

쓰이는 것은 성 없는 이름 하나입니다. 명사구가 아니라서 관사도 수식어도 붙지 않고, 한국어 조사는 다른 단어와 똑같이 이름의 마지막 글자를 보고 고릅니다(소한이, 은영이). 이름은 뽑을 때 정해진 성별을 그대로 지니고 있어서, 스페인어와 이탈리아어와 러시아어의 서술 형용사가 거기에 맞춰 굴절합니다. Celeste è affamata 옆에 Ivano è raro가 나오는 이유입니다. 이름은 어느 단어 풀에도 없으므로 생성기가 성별을 읽어 낼 곳이 이것밖에 없습니다.

이름은 명사구보다 짧습니다. die schlanke Wolke가 설 자리에 Yvonne이 서므로, 이름을 쓴 결과는 그 언어가 쓰는 가장 긴 문장에 닿지 못합니다. 대신 가장 짧은 문장보다 짧아지지도 않습니다. 문형은 위쪽 끝에서는 이름을, 아래쪽 끝에서는 그 언어의 명사를 기준으로 고르므로, sentenceLengthRangesentenceLengthRangesentence_length_range가 알려 주는 범위는 주어가 무엇이 되든 지켜집니다.

이름은 사람이 설 수 있는 자리에만 섭니다. 이 옵션을 켜면 주어가 사람을 가리키는 테마로 좁혀지므로 문장에 이름을 둘 자리가 생깁니다. 직접 지정한 theme이 우선이며, 그때는 이름이 쓰이지 않습니다.

javascript
randSentence({ language: 'en', theme: 'animal', includeName: true, count: 2 });
// ['The wildebeest is lazy.', 'Yesterday, the moose stops.']
dart
randSentence(language: WordLanguage.en, theme: WordTheme.animal, includeName: true, count: 2);
// [The wildebeest is lazy., Yesterday, the moose stops.]
python
rand_sentence(language="en", theme="animal", include_name=True, count=2)
# ['The wildebeest is lazy.', 'Yesterday, the moose stops.']

SentenceDetail.names는 결과에 쓰인 이름을 알려 줍니다. 주어가 이름이면 theme: nulltheme: nulltheme=None입니다. 이름은 어느 테마에도 속하지 않기 때문입니다.

쓰든 쓰지 않든 22 KB가 늡니다

이 옵션은 사람 이름 풀에 손을 대는데, 동기 API에는 동적 import로 숨길 자리가 없습니다. 그래서 randSentence를 포함하는 번들은 이름 풀도 함께 포함합니다. esbuild로 randSentence만 번들하고 gzip한 결과는 이전 122.5 KB, 이후 144.5 KB+22.0 KB, +18%입니다. 문장 생성기는 이미 단어 풀 전체를 들고 있고 그것이 110 KB이며, 이름 풀은 그 옆의 22 KB입니다.

이름을 쓸 일이 없고 번들 크기가 중요하다면 randSentence를 가져오지 않는 것 외에 방법이 없습니다.

상세 출력

output: 'detail'은 문자열 대신 각 문장을 이루는 요소를 알려 줍니다. 구를 순서대로, 각 구가 하는 일, 시제, 이야기, 언어, 그리고 주어의 테마입니다.

Dart에는 인자에 따라 반환 타입이 달라지는 함수를 만들 방법이 없어서, 이 기능은 별도 함수 randSentenceDetails로 되어 있습니다. 인자는 randSentence와 같습니다.

javascript
randSentence({ language: 'ko', output: 'detail', count: 1 });
// [{
//   sentence: '그리핀이 자줏빛 숲에서 총명한 고량주를 삼킨다.',
//   sentences: ['그리핀이 자줏빛 숲에서 총명한 고량주를 삼킨다.'],
//   phrases: ['그리핀', '자줏빛 숲', '총명한 고량주', '삼킨다'],
//   slots: ['subject', 'place', 'object', 'verb'],
//   names: [],
//   types: ['statement'],
//   tense: 'present',
//   story: null,
//   language: 'ko',
//   theme: 'myth'
// }]
dart
randSentenceDetails(language: WordLanguage.ko).first;
// SentenceDetail(그리핀이 자줏빛 숲에서 총명한 고량주를 삼킨다.,
//                [그리핀, 자줏빛 숲, 총명한 고량주, 삼킨다], ko, myth)
randSentenceDetails(language: WordLanguage.ko).first.slots;
// [SentenceSlot.subject, SentenceSlot.place, SentenceSlot.object, SentenceSlot.verb]
python
rand_sentence(language="ko", output="detail", count=1)
# [SentenceDetail(sentence='그리핀이 자줏빛 숲에서 총명한 고량주를 삼킨다.',
#                 sentences=('그리핀이 자줏빛 숲에서 총명한 고량주를 삼킨다.',),
#                 phrases=('그리핀', '자줏빛 숲', '총명한 고량주', '삼킨다'),
#                 slots=('subject', 'place', 'object', 'verb'),
#                 names=(), types=('statement',), tense='present', story=None,
#                 language='ko', theme='myth')]
필드타입설명
sentencestringStringstr문장 부호까지 포함한 완성된 결과. 모든 문장을 이어 붙인 것입니다.
sentencesstring[]List<String>tuple[str, ...]문장마다 하나씩. sentences로 더 요청하지 않았다면 항목 하나입니다.
phrasesstring[]List<String>tuple[str, ...]문장을 이루는 구를 순서대로. 조사는 빠져 있습니다. 모든 문장을 통틀어 한 줄로 이어집니다.
slotsSentenceSlot[]List<SentenceSlot>tuple[SentenceSlot, ...]각 구가 하는 일. phrases와 같은 인덱스입니다.
namesstring[]List<String>tuple[str, ...]결과에 쓰인 사람 이름을 순서대로. includeName으로 요청하지 않았다면 비어 있습니다.
typesSentenceType[]List<SentenceType>tuple[SentenceType, ...]각 문장이 무엇을 하는지. sentences와 같은 자리입니다.
tenseSentenceTense언제 일어난 일인지. 결과 전체가 한 시제입니다.
storySentenceStory | nullSentenceStory?SentenceStory | None여러 문장짜리 결과가 따른 이야기. 문장 하나짜리 결과에서는 null입니다.
languageWordLanguage이 문장을 만든 언어.
themeWordTheme | nullWordTheme?WordTheme | None주어의 테마. 이야기에서는 주인공의 테마이고, 그 밖에는 첫 문장의 것으로 나머지 문장이 계속 이야기하는 대상입니다. 생성기가 모르는 단어면 null이며, 사람 이름도 그렇습니다.

phrases에는 구만 들어 있습니다. 구를 표시하는 조사나 전치사는 sentence에만 있으므로, 그리핀이 …그리핀으로 보고되고 구를 다시 이어 붙여도 원래 문장이 되지 않습니다. 완성된 문자열은 sentence에서, 문장을 이루는 요소는 phrases에서 읽으면 됩니다.

모든 문장에는 subject가 정확히 하나, 서술어가 정확히 하나 있습니다. 그 서술어는 verb이거나 state이며, 둘 다인 경우는 없습니다.

첫 글자

startsWith는 지정한 글자로 시작하는 문장만 남깁니다. 이 조건이 충족되는 방식은 언어에 따라 둘로 나뉩니다.

관사를 쓰지 않고 명사구가 먼저 오는 언어(한국어, 일본어, 중국어)는 유도됩니다. 그 글자로 시작하는 단어 중에서 명사를 뽑으므로 거의 모든 시도가 조건을 만족합니다.

javascript
randSentence({ language: 'ko', startsWith: '사', count: 3 });
// ['사자가 달린다.', '사슴이 물을 마신다.', '사과가 익는다.']

관사나 전치사, 부사구가 앞에 오는 언어(영어, 스페인어, 이탈리아어, 독일어, 러시아어)는 그렇게 유도할 수 없습니다. 문장의 첫 단어가 명사가 아니기 때문입니다. 이 언어들은 걸러집니다. 평소대로 문장을 뽑은 뒤 그 글자로 시작하지 않는 것을 버립니다. 흔한 첫 글자는 금방 채워지지만, 드문 글자는 요청한 개수보다 적게 돌아오거나 하나도 돌아오지 않을 수 있습니다.

javascript
randSentence({ language: 'es', startsWith: 'e', count: 3 }); // `el`, `en` 덕분에 금방 3개
randSentence({ language: 'es', startsWith: 'z', count: 3 }); // []

그 언어가 아예 쓰지 않는 문자를 넘기면 두 문자 체계가 섞인 문장 대신 빈 배열이 돌아옵니다. 모든 언어를 대상으로 하면 그 글자를 쓸 수 있는 언어로 좁혀지므로, startsWith: 'ж'는 러시아어를 뽑습니다.

javascript
randSentence({ language: 'ko', startsWith: 'Q' }); // []
randSentence({ startsWith: 'ж', count: 2 }); // 러시아어 문장 2개

주어의 테마

theme은 문장의 주어를 어떤 테마에서 뽑을지 좁힙니다. 목적어와 장소는 동사가 허용하는 부류에서 뽑습니다.

javascript
randSentence({ language: 'en', theme: 'animal', count: 3 });
// ['The hippo sleeps in the starburst.', 'The sparrow approaches in the lightyear.', 'The puppy swallows the calm springwater briefly.']
dart
randSentence(language: WordLanguage.en, theme: WordTheme.animal, count: 3);
// [The hippo sleeps in the starburst., The sparrow approaches in the lightyear.]
python
rand_sentence(language="en", theme="animal", count=3)
# ['The hippo sleeps in the starburst.', 'The sparrow approaches in the lightyear.']

지어낸 단어, 실제 문법

realism은 단어가 어디서 오는지만 정합니다. 조사도 관사도 형태도 그 언어의 것이므로, 지어낸 단어로 된 문장도 문법은 그대로입니다.

javascript
randSentence({ language: 'ko', realism: 'invented', count: 3 });
// ['수줍은 노오가 안개 파저멜을 챙긴다.', '터패가 민다에서 젤보피를 꿈꾼다.', '한겨울 코델피가 뿌리내린다.']
dart
randSentence(language: WordLanguage.ko, realism: RandRealism.invented, count: 3);
// [수줍은 노오가 안개 파저멜을 챙긴다., 터패가 민다에서 젤보피를 꿈꾼다.]
python
rand_sentence(language="ko", realism="invented", count=3)
# ['수줍은 노오가 안개 파저멜을 챙긴다.', '터패가 민다에서 젤보피를 꿈꾼다.']

함께 보기

  • 문장 — 형태와 명사 부류, 그리고 언어마다 쓸 수 있는 것.
  • sentenceLengthRange — 한 언어가 만들 수 있는 문장 길이의 범위.
  • randWord — 문장을 이루는 어휘.

Released under the MIT License