Случайные числа и поиск максимума
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. Алгоритм поиска максимума
Идея
- Предполагаем, что первый элемент — максимальный
- Проходим по остальным элементам
- Если нашли больше → обновляем максимум
Код
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]
}
}
Что смотреть
- Переменная
i— текущий индекс - Значение
randomNums[i]— проверяемый элемент - Переменная
max— текущий максимум - Условие
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() → фиксация для тестов
✅ Поиск максимума: начать с первого элемента, обновлять при нахождении большего
✅ Отладчик — лучший способ понять алгоритм
Практика: Реализуйте поиск минимума, второго по величине элемента, индекса максимума.