Что нового

Генератор случайных имен

nicotino

Новичок
Сообщения
30
Репутация
0
Версия AutoIt: 3.3.8.1

Описание: Генератор случайных имен.

Примечания: Генерирует какое нибудь слово из шести букв и записывает в текстовый документ. Нельзя чтобы гласные и согласные буквы повторялись более двух раз сподряд, так же при генерации проверяет в текстовом документе нет ли совпадений (мало ли может такое случится).

Если кто нибудь предложит рабочий или примерный код буду очень благодарен.
 

ArtInt

Знающий
Сообщения
135
Репутация
18
nicotino,
Код:
Dim $name
    Dim $n    ;n - количество букв, пишем вручную
Dim $letters [2][$n][2] ;заполняем вручную - [0][?][0] - гласные, [1][?][0] - согласные. [?][?][1] не трогаем

Dim $sogl_gl=0
Dim $sogl_mode = Random(0,1)

For $i = 1 to Inputbox("querry","skolko bukv v imeni?")
 $rnd = Random(0,$n)
 $name &= $letters [$sogl_mode][$rnd][0]
If NOT $letters [$sogl_mode][$rnd][1]>2 then
   $letters [$sogl_mode][$rnd][1] +=1
Else
;выпиливаем букву из списка, если нужно, напишу
Endif


$sogl_gl += Random (1,2)
If $sogl_gl>2 then
    $sogl_gl = 0
    $sogl_mode = not $sogle_mode    ;теоретически 0 превращается в 1
Endif
Next


Если заинтересовал способ или никто другой не отпишется (в чём сомневаюсь) могу дописать. Просто это не лучший метод. Удачи
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Самое простое что может быть.
Код:
#region Настройки
$sALLs = "цкнгшщзхвпрлджчсмтб"
$sALLg = "уеыаоэяию"
$iNameLen = 3
$fBigFirst = 1
#endregion Настройки
Local $iSizeALLs = StringLen($sALLs), $iSizeALLg = StringLen($sALLg)
For $k = 1 To 100
	Local $sName = ""
	For $i = 1 To $iNameLen
		$sName &= StringMid($sALLs, Random(1, $iSizeALLs, 1), 1) & StringMid($sALLg, Random(1, $iSizeALLg, 1), 1)
	Next
	If $fBigFirst Then $sName = StringUpper(StringLeft($sName, 1)) & StringTrimLeft($sName, 1)
	ConsoleWrite($sName & @LF)
	IniWrite("name.txt", "names", $sName, "")
Next
 

ArtInt

Знающий
Сообщения
135
Репутация
18
nicotino, правильно inververs написал, с массивами я перегнул, достаточно строки из символов. Тогда я оформил бы так:
[box title=Скрипт создаёт 1 случайное имя]
Код:
Dim $name
Dim $n    ;n - количество букв, пишем вручную

Dim $letters [2]; набор букв, заполняем ниже
$letters[0]="цкнгшщзхвпрлджчсмтб" ;согласные
$letters[1]=""уеыаоэяию"" ;гласные

Dim $x_letters ;использованные символы

Dim $sogl_gl=0
Dim $sogl_mode = Random(0,1)

For $i = 1 to $n
 $rnd = Random(0,StringLen($letters[$sogl_mode]))
 $new_letter = StringMid ($letters [$sogl_mode],$rnd,1)

 $name &= $new_letter

Dim $in ;кол-во употреблений добавленного символа
$in = 0 ;инициализация

Do
return = StringInStr($x_letters,$new_letter, $in+1) 
if $return <> 0 then in+=1
Until $return = 0

If $in>=2 then
   $x_letters &=StringMid ($letters [$sogl_mode],$rnd,1)
Else
    StringReplace ($letters[$sogl_mode],$new_letter,"")
Endif

$sogl_gl += Random (1,2)
If $sogl_gl>2 then
    $sogl_gl = 0
    $sogl_mode = not $sogl_mode    ;теоретически 0 превращается в 1
Endif

If $i=1 then StringUpper ($name) 
Next
[/box]

inververs, у тебя разве проверяет повтор букв?
 
Автор
N

nicotino

Новичок
Сообщения
30
Репутация
0
inververs, у тебя разве проверяет повтор букв?

у него вроде просто чередует гласные и согласные, врпинципе там не будет повтора может только получится типа Рарарар но это не так страшно.

ArtInt, в твоем коде почему то согласные только в конце слова и иногда слова повторяются :scratch:

Выражаю вам свою благодарность :smile:
 

ArtInt

Знающий
Сообщения
135
Репутация
18
nicotino, пометь тему решённой тогда.


nicotino [?]
и иногда слова повторяются
Я проверку повторений не делал - мой скрипт просто создаёт 1 имя.

Вот, скрипт создаёт массив $names полностью уникальных имён.
Код:
Dim $name
Dim $n    ;n - количество букв, пишем ниже


Dim $n2 ;n2 - кол-во имён, пишем ниже
$n2 = 10

Dim $names[$n2]

Dim $letters [2]; набор букв, заполняем ниже
$letters[0]="цкнгшщзхвпрлджчсмтб" ;согласные
$letters[1]="уеыаоэяию" ;гласные

$iGenerating = 0

Do
$original = 1

Dim $x_letters ;использованные символы

Dim $sogl_gl=0
Dim $sogl_mode = Random(0,1)
$n=Random (5, 20)

For $i = 1 to $n
 $rnd = Random(0,StringLen($letters[$sogl_mode]))
 $new_letter = StringMid ($letters [$sogl_mode],$rnd,1)

 $name &= $new_letter

Dim $in ;кол-во употреблений добавленного символа
$in = 0 ;инициализация

Do
$return = StringInStr($x_letters,$new_letter, $in+1)
if $return <> 0 then $in+=1
Until $return = 0

If $in>=2 then
   $x_letters &=StringMid ($letters [$sogl_mode],$rnd,1)
Else
    StringReplace ($letters[$sogl_mode],$new_letter,"")
Endif

$sogl_gl += Random (1,2)
If $sogl_gl>1 then
    $sogl_gl = 0
    $sogl_mode = not $sogl_mode    ;теоретически 0 превращается в 1
Endif

If $i = 1 then $name=StringUpper($name)
Next

If not $iGenerating=0 then
For $i =0 to $iGenerating-1
	If $name = $names[$i] then $original=0
Next
EndIf
If $original=1 then 
	$names[$iGenerating] = $name
	$iGenerating +=1
EndIf

Until $iGenerating>= $n2-1
 
Верх