Случайные числа и поиск максимума

1. Генерация случайных чисел в массиве

Задача

Заполнить массив случайными числами вместо констант или формул.

Код

var randomNums [10]int

for i := 0; i < len(randomNums); i++ {
    randomNums[i] = rand.Intn(100) + 1  // От 1 до 100
}

Диапазон:

  • rand.Intn(100) → от 0 до 99
  • + 1 → от 1 до 100

2. Фиксированная последовательность (для тестирования)

Проблема

При каждом запуске — новые числа → сложно проверять результаты.

Решение: установить seed

rand.Seed(42)  // Фиксированное начальное значение

var randomNums [10]int
for i := 0; i < len(randomNums); i++ {
    randomNums[i] = rand.Intn(100) + 1
}
// Каждый запуск → одинаковые числа

Когда использовать: Отладка, тесты, воспроизводимость результатов.


3. Алгоритм поиска максимума

Идея

  1. Предполагаем, что первый элемент — максимальный
  2. Проходим по остальным элементам
  3. Если нашли больше → обновляем максимум

Код

max := randomNums[0]  // Отправная точка

for i := 1; i < len(randomNums); i++ {  // С индекса 1!
    if randomNums[i] > max {
        max = randomNums[i]
    }
}

fmt.Printf("Максимум: %d\n", max)

Важно: Цикл начинается с i = 1, т.к. нулевой элемент уже взят как начальный максимум.


4. Пошаговая трассировка алгоритма

Пример массива

Индекс:  0   1   2   3   4   5
Массив: [3, 11, 5, 4, 21, 7]

Шаг 0: Инициализация

max = randomNums[0]  // max = 3

Итерация 1 (i=1)

randomNums[1] = 11
11 > 3?  → ДА
max = 11  // Обновление

Итерация 2 (i=2)

randomNums[2] = 5
5 > 11?  → НЕТ
max = 11  // Без изменений

Итерация 3 (i=3)

randomNums[3] = 4
4 > 11?  → НЕТ
max = 11

Итерация 4 (i=4)

randomNums[4] = 21
21 > 11?  → ДА
max = 21  // Обновление

Итерация 5 (i=5)

randomNums[5] = 7
7 > 21?  → НЕТ
max = 21

Результат: max = 21


5. Визуализация через отладчик

Точка останова

Поставить breakpoint внутри цикла на строке с if:

for i := 1; i < len(randomNums); i++ {
    // ← breakpoint
    if randomNums[i] > max {
        max = randomNums[i]
    }
}

Что смотреть

  1. Переменная i — текущий индекс
  2. Значение randomNums[i] — проверяемый элемент
  3. Переменная max — текущий максимум
  4. Условие randomNums[i] > max — true/false

Совет: Пройдите все итерации с F10, следя за изменениями max.


6. Полный код с комментариями

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    // Инициализация генератора
    rand.Seed(time.Now().UnixNano())  // Разные числа
    // rand.Seed(42)                  // Одинаковые числа (для теста)
    
    // Заполнение массива
    var nums [6]int
    for i := 0; i < len(nums); i++ {
        nums[i] = rand.Intn(20) + 1  // От 1 до 20
    }
    fmt.Printf("Массив: %v\n", nums)
    
    // Поиск максимума
    max := nums[0]  // Предполагаем, что первый — максимум
    
    for i := 1; i < len(nums); i++ {
        if nums[i] > max {
            max = nums[i]  // Нашли больше — обновляем
        }
    }
    
    fmt.Printf("Максимум: %d\n", max)
}

7. Модификации алгоритма

Поиск минимума

min := nums[0]
for i := 1; i < len(nums); i++ {
    if nums[i] < min {  // Меняем знак!
        min = nums[i]
    }
}

Поиск индекса максимума

maxIndex := 0
for i := 1; i < len(nums); i++ {
    if nums[i] > nums[maxIndex] {
        maxIndex = i  // Сохраняем индекс, а не значение
    }
}
fmt.Printf("Максимум %d на позиции %d\n", nums[maxIndex], maxIndex)

Сумма и среднее

sum := 0
for i := 0; i < len(nums); i++ {
    sum += nums[i]
}
average := float64(sum) / float64(len(nums))
fmt.Printf("Среднее: %.2f\n", average)

8. Типичные ошибки

Цикл с индекса 0:

max := nums[0]
for i := 0; i < len(nums); i++ {  // Сравнит сам с собой!
    if nums[i] > max { ... }
}

✅ Начинать с i = 1

Неправильная инициализация:

max := 0  // Что если все числа отрицательные?

✅ Брать первый элемент: max := nums[0]

Забыли + 1 в диапазоне:

rand.Intn(100)  // 0-99, а не 1-100

9. Итоги

rand.Intn(N) + 1 → случайное число от 1 до N
rand.Seed() → фиксация для тестов
✅ Поиск максимума: начать с первого элемента, обновлять при нахождении большего
✅ Отладчик — лучший способ понять алгоритм

Практика: Реализуйте поиск минимума, второго по величине элемента, индекса максимума.