Что нового

[Массивы] Рандом и равномерное распределение

warezoogle3

Новичок
Сообщения
73
Репутация
1
Пробовал написать программу, которая будет писать в файл имена животных через запятую и пробел и чтобы имя животного не повторялось до того, как другие имена не написаны. Одним словом, в каждом куске текста (в данном случае блок величиной 12 элементов) все элементы должны присутствовать (минимум и максимум 1 раз). Фазовый сдвиг не считается.

Вот код:
Код:
#include <File.au3>
#include <Array.au3>
#RequireAdmin

Global $arr[12] = ["cat","dog","wolf","lion","tiger","elephant","bear","mouse","rat","monkey","dolphin","horse"]
Global $arr2[12] = ["cat","dog","wolf","lion","tiger","elephant","bear","mouse","rat","monkey","dolphin","horse"]

$file = Fileopen(@ScriptDir & "\animals.txt",1)

Global $count = 0

While $count < 5

Do
$randind = Random(0, UBound($arr-1), 1)
$randn = $arr[$randind]

FileWrite($file,$randn & ", ")

_ArrayDelete($arr,$randind)

Until $arr = ""


$arr = $arr2

$count = $count + 1


WEnd

FileClose($file)


Что я делаю не так?

Помогите, пожалуйста! :beer:

Заранее спасибо!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
Global $Arr[12] = ['cat', 'dog', 'wolf', 'lion', 'tiger', 'elephant', 'bear', 'mouse', 'rat', 'monkey', 'dolphin', 'horse']

$File = FileOpen(@ScriptDir & '\animals.txt', 1)

For $i = 1 To 5
	_ArrayShuffle($Arr)
	For $j = 0 To UBound($Arr) - 1
		FileWrite($File, $Arr[$j] & ', ')
	Next
Next

FileClose($File)

Func _ArrayShuffle(ByRef $aArray, $Count = 2)

	Local $A, $B, $Temp

	For $i = 1 To $Count * UBound($aArray)
		$A = Random(0, UBound($aArray) - 1, 1)
        $B = Random(0, UBound($aArray) - 1, 1)
        $Temp = $aArray[$A]
        $aArray[$A] = $aArray[$B]
        $aArray[$B] = $Temp
	Next
EndFunc   ;==>_ArrayShuffle
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
Global $arr = ["cat", "dog", "wolf", "lion", "tiger", "elephant", "bear", "mouse", "rat", "monkey", "dolphin", "horse"]

For $count = 1 To 5
	$mix = _array_mix($arr)
	$out = ''
	For $animal In $mix
		$out &= $animal & ', '
	Next
	FileWrite('aminal.txt', $out & @CRLF)
Next

Func _array_mix($a) ;Перемешивание массива случайным образом
	$u = UBound($a) - 1
	For $i = 0 To $u
		$b = Random(0, $u, 1)
		$c = $a[$b]
		$a[$b] = $a[$i]
		$a[$i] = $c
	Next
	Return $a
EndFunc   ;==>_array_mix
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Код:
#include <File.au3>
#include <Array.au3>
#RequireAdmin

Global $arr[12] = ["cat","dog","wolf","lion","tiger","elephant","bear","mouse","rat","monkey","dolphin","horse"]
Global $arr2[12] = ["cat","dog","wolf","lion","tiger","elephant","bear","mouse","rat","monkey","dolphin","horse"]

FileDelete(@ScriptDir & '\animals.txt')
$file = Fileopen(@ScriptDir & "\animals.txt",1)

Global $count = 0

While $count < 5

Do
$randind = Random(0, UBound($arr)-1, 1) ; <--
$randn = $arr[$randind]

FileWrite($file,$randn & ", ")

_ArrayDelete($arr,$randind)

Until UBound($arr)=0 ; <--
consolewrite("df")

$arr = $arr2

$count = $count + 1


WEnd

FileClose($file)
 
Автор
W

warezoogle3

Новичок
Сообщения
73
Репутация
1
Yashied, inververs, Z_Lenar, Спасибо огромное за помощь! :beer: Много интересно выучил!

Как я понял, это алгоритм Fisher–Yates shuffle?
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
warezoogle3
Это алгоритм Yashied-inververs, не иначе как. ;)
 
Верх