Что нового

Заполнить одномерный массив случайными числами без повтора

Rinfes

Новичок
Сообщения
25
Репутация
0
Здравствуйте. Нужна помощь. Есть одномерный массив из 10 элементов. Нужно заполнить его случайными числами без повтора. Числа целые, от 1 до 20.
 

madmasles

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

$oDict = ObjCreate('Scripting.Dictionary')
If @error Then Exit 1
Do
	$oDict.Item(Random(1, 20, 1))
Until $oDict.Count = 10

$aRes = $oDict.Keys
$oDict = 0
_ArrayDisplay($aRes)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
#include <Array.au3>

; вариант 1 - строковый
Global $str = "|", $i = 0
Do
  $num = Random(1, 20, 1) & "|"
  If Not StringInStr($str, "|" & $num) Then
    $str &= $num
    $i += 1
  EndIf
Until $i = 10
$str = StringTrimRight(StringTrimLeft($str, 1), 1)
$array = StringSplit($str, "|", 2)
_ArrayDisplay($array)

; вариант 2 - вероятностный
Global $array[100]
For $i = 0 To 99
  $array[$i] = Random(1, 20, 1)
Next
$array = _ArrayUnique($array)
ReDim $array[10]
_ArrayDisplay($array)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
на всякий случай
http://autoit-script.ru/index.php?topic=14954.msg93991#msg93991
http://autoit-script.ru/index.php?topic=6462.msg52949#msg52949
 
Автор
Rinfes

Rinfes

Новичок
Сообщения
25
Репутация
0
Подсказали еще такой вариант:
Код:
#Include <array.au3>

 $COUNT=10

 Dim $RND[$COUNT+1]

 For $J=1 To $COUNT
  $RND[$J]=$J
 Next
 $J=$COUNT
 While $J>1
  $U=Random(0,$J)
  $K=Floor($U)+1
  $T=$RND[$K]
  $RND[$K]=$RND[$J]
  $RND[$J]=$T
  $J-=1
 WEnd

 _ArrayDisplay($RND)
 

qqww22

Новичок
Сообщения
115
Репутация
4
Rinfes сказал(а):
Подсказали еще такой вариант:
Код:
#Include <array.au3>

 $COUNT=10

 Dim $RND[$COUNT+1]

 For $J=1 To $COUNT
  $RND[$J]=$J
 Next
 $J=$COUNT
 While $J>1
  $U=Random(0,$J)
  $K=Floor($U)+1
  $T=$RND[$K]
  $RND[$K]=$RND[$J]
  $RND[$J]=$T
  $J-=1
 WEnd

 _ArrayDisplay($RND)

Код:
int main() {
	int num = 10;
	int * q = new int[num]; 

	   for (int i = 0; i < num; i++) {
        // Заполнение массива и вывод значений его элементов
        q[i] = i;
        cout << "Value of " << i << " element is " << q[i] << endl;
    }
	
	
	system("pause");
}
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
qqww22 , мы тут говорим про AutoIt.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Вот мой вариант, кажется работает. :smile:
Код:
#include <Array.au3>
Global $array[0], $iRandom
For $i = 1 To 10
	While 1
		$iRandom = Random(1, 20, 1)
		If _ArraySearch($array, $iRandom) == -1 Then
			_ArrayAdd($array, $iRandom)
			ExitLoop
		EndIf
	WEnd
Next
_ArrayDisplay($array)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Самый оптимальный вариант предложил madmasles, все остальное либо слишком перегружено, либо очень долго. Можно еще вместо COM использовать Assign().

Код:
#Include <Array.au3>

Dim $aArray[10]

$ID = 0
Do
	$iValue = Random(1, 20, 1)
	If Not IsDeclared($iValue) Then
		Assign($iValue, 0, 1)
		$aArray[$ID] = $iValue
		$ID += 1
	EndIf
Until $ID > UBound($aArray)	- 1

_ArrayDisplay($aArray)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Но самый правильный способ это сперва заполнить массив от ... и до, а затем случайно перемешать _ArrayShuffle.
 
Верх