Что нового

Как задать процент срабатывания?

uritalex

Новичок
Сообщения
197
Репутация
3
Добрый день!
И снова прошу совета и помощи у гуру кодописания :smile:
Появилась необходимость задать срабатывание функций не рандомно, а в процентном соотношении.
К примеру в текстовом редакторе нужно написать 100 строк.
Есть 5 слов (типа функций) : Петя, Вася, Иван, Игорь, Васек
Так вот нужно каждому слову задать процент срабатывания
Петя - 10
Вася - 25
Иван - 50
Игорь - 10
Васек - 5
В итоговом документе слово должно вставляться в хаотичном порядке столько раз сколько задано в процентах.
Как то так.
Может кто реализовывал для себя такое.

Добавлю код :smile: что работает сейчас (но без процента, а на полном рандоме):
Код:
For $i=1 to 100
    $_1 = Random (1,5,1)
	Select
		Case $_1=1
			$_words = 'Петя'
		Case $_1=2
			$_words = 'Вася'
		Case $_1=3
			$_words = 'Иван'
                Case $_1=4
			$_words = 'Игорь'
		Case Else
			$_words = 'Васек'
		EndSelect
          ConsoleWrite($_words & @CRLF)
Next
 

Vintets

Новичок
Сообщения
12
Репутация
4
А если нужно написать 101 строку, сколько раз там будет 'Васек'? А сколько 'Петя'?
Или тебе нужно не точное значение, а вероятность выпадания около n%
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
итоговое количество известно, т.е. 100 строк
 

Vintets

Новичок
Сообщения
12
Репутация
4
Так как количество всего 100, предлагаю не париться, а просто занести в массив каждое имя нужное количество раз. После перемешать массив и извлекать по одному.

Код:
Global $aNames[5][2] = [['Петя',10], _
                        ['Вася',25], _
                        ['Иван',50], _
                        ['Игорь',10], _
                        ['Васек',5]]

Global $aName[100]
Global $imax = 0, $temp

;~ заносим в массив
For $i = 0 To UBound($aNames) - 1
    $name = $aNames[$i][0]
    $count = $aNames[$i][1]
    For $j = 0 To $count - 1
        $aName[$imax + $j] = $name
    Next
    $imax += $count
Next

;~ перемешиваем
For $i = 0 to 99
    $ind = Random(0, 99, 1)
    $temp = $aName[$i]
    $aName[$i] = $aName[$ind]
    $aName[$ind] = $temp
Next

;~ выводим по одному когда нужно
For $i=0 to 99
    ConsoleWrite($aName[$i] & @CRLF)
Next
 

Vintets

Новичок
Сообщения
12
Репутация
4
Возможно.
Но в моём AutoIt 3.3.8.1 я никакого _ArrayShuffle не нашёл, как и в русской онлайн справке.
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Спасибо за варианты буду пробовать !
 
Верх