Что нового

Генератор случайных уникальных чисел.

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Помогите функцией.
Функция принимает минимальное и максимальное значение для диапазона чисел.
Составляет и возвращает массив состоящий из уникальных чисел (целых) из этого диапазона
Числа в массиве должны равномерно распределены по массиву. Конечно массив вида 1,2,3 ... n не правильный :smile:

Посути задача сводится к случайному перемешиванию массива состоящего из чисел. Спасибо.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
С такой репутацией и такие вопросы задавать... :-[

Код:
If Not _FileReadToArray("spisok.txt",$sRecords) Then
			MsgBox(4096,"Error", "Невозможно прочитать файл со списком.")
			Exit
		EndIf
		_FileReadToArray("spisok.txt",$aRecords)

		_ArrayDisplay($sRecords)
		_ArrayDelete($sRecords,0)
		For $i = 1 To $aRecords[0]
			$j=Random(0,UBound($sRecords)-1,1)
			$aRecords[$i] = $sRecords[$j]
			_ArrayDelete($sRecords,$j)
		Next
		_ArrayDisplay($aRecords)

Просто выдернул кусок из запущенного бота. Смотри, разбирайся.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
C2H5OH
спасибо, нету времени просто)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
Можно так попробовать.
Код:
#include <Array.au3>

$aRandom = _RandomNumArray(10, 1000, 1)
If @error Then Exit 13
_ArrayDisplay($aRandom)

#cs
	Генерирует массив случайных чисел одинаковой длины.
	$a_Random[0] - их кол-во.
	$i_Num - кол-во цифр в случайных числах (длина) (от 2 до 10)
	$i_Count - кол-во случайных чисел (от 89 и более)
	$i_Sort <> 0 - сортировка массива по возрастанию
#ce
Func _RandomNumArray($i_Num = 4, $i_Count = 10, $i_Sort = 0)
	Local $i_Min = 1, $i_Max = 9, $a_Random[1]

	If $i_Num < 2 Then Return SetError(1, 0, -1)
	If $i_Num > 10 Then Return SetError(1, 0, -1)
	If $i_Count < 2 Then Return SetError(2, 0, -1)
	If $i_Num = 10 Then
		$i_Min = 1000000000
		$i_Max = 2 ^ 31 - 1
	Else
		For $i = 1 To $i_Num - 1
			$i_Min &= 0
			$i_Max &= 9
		Next
		$i_Min = Number($i_Min)
		$i_Max = Number($i_Max)
	EndIf
	If $i_Max - $i_Min < $i_Count Then Return SetError(2, 0, -1)
	ReDim $a_Random[$i_Count + 1]
	$a_Random[0] = $i_Count
	For $i = 1 To $i_Count
		$a_Random[$i] = Random($i_Min, $i_Max, 1)
		While IsDeclared($a_Random[$i])
			$a_Random[$i] = Random($i_Min, $i_Max, 1)
		WEnd
		Assign($a_Random[$i], 1)
	Next
	If $i_Sort Then
		_ArraySort($a_Random, 0, 1)
	EndIf
	Return $a_Random
EndFunc   ;==>_RandomNumArray
Я исправил ошибку с максимальным числом.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
madmasles
Спасибо, я посмотрю


Добавлено:
Сообщение автоматически объединено:

Использовал идею C2H5OH. Может кому нибудь понадобится.
Код:
$aU=_UniqArray(4,12)
_ArrayDisplay($aU)

Func _UniqArray($iMin, $iMax)
	Local $iU = $iMax - $iMin, $iT = 0
	Local $aI[$iU + 1], $aO[$iU + 1]
	For $i = $iMin To $iMax
		$aI[$iT] = $i
		$iT += 1
	Next
	For $i = 0 To $iU
		$iR = Random(0, $iU - $i, 1)
		$aO[$i] = $aI[$iR]
		For $k = $iR To $iU - $i - 1
			$aI[$k] = $aI[$k + 1]
		Next
	Next
	Return SetError(0, 0, $aO)
EndFunc   ;==>_UniqArray
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
inververs [?]
Посути задача сводится к случайному перемешиванию массива состоящего из чисел. Спасибо.
Для этого вроде как есть
Код:
_ArrayRandomize()
 
Верх