Ибо петля заканчивается своим телом - PullRequest
0 голосов
/ 10 октября 2018

Поскольку цикл заканчивается его телом и не идет дальше

Мне нужно найти wIndex, проверить, есть ли его в срезе, если нет добавочного значения Где я ошибаюсь?

var x make(map[int]float32, 10)
var s []int
var value = 100
for i := 1; i <= 10; i++ {
    wIndex := int(rand.Intn(len(x))) // random Index choice among map values
    for _, v := range s {            //end of loop here (if exactly it returnts to loop before)
        if v != wIndex {
            s = append(s, wIndex)
            x[wIndex] += value
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы начинаете с пустого s среза.Поэтому вы никогда не войдете в свой внутренний цикл for, где добавляете элементы к срезу.

Вот альтернативный и прямой способ сделать это:

for i := 1; i <= 10; i++ {
    wIndex := int(rand.Intn(len(x) + 1)) 
    found := false
    for _, v := range s {
        if v == wIndex {
            found = true
            break
        }
     }
     if !found {
        s = append(s, wIndex)
        x[wIndex] += float32(value)
     }
 }
  • обратите внимание, что вам нужно преобразовать значение в тип float32, поэтому x[wIndex] += float32(value) вместо просто x[wIndex] += value

  • rand.Intn(n int) генерирует числа в диапазоне [0, n), поэтому вынеобходимо добавить 1, чтобы покрыть нужный диапазон, и избегать паники, когда карта пуста.

0 голосов
/ 10 октября 2018

Внутренний цикл никогда не будет выполнен, потому что у среза нет значения, которое он является пустым, поэтому вставьте случайное значение в срез, а затем разместите его в диапазоне.

Есть и другие вещи, на которые следует обратить внимание, так как rand.Intn уже возвращает int, тогда нет необходимости вводить тип cast в int.

int(rand.Intn(len(x))) // no requirement to typecast it into int.

Еще одна вещь - это длина карты 0, поэтому rand.Intn выдаст ошибку при запуске вашего кода.

wIndex := int(rand.Intn(len(x))) // This will throw an error.

Измените ваш код какниже.

package main

import (
    "fmt"
    "math/rand"
)

func main() {

    var x = make(map[int]float32)
    var s []int
    var value = 100
    for i := 1; i <= 10; i++ {
        wIndex := rand.Intn(10) // random Index choice among map values
        s = append(s, wIndex)
        for _, v := range s { //end of loop here (if exactly it returnts to loop before)
            if v != wIndex {
                x[wIndex] += float32(value)
            }
        }
    }
    fmt.Println(s)
    fmt.Println(x)
}

Пример работы на Перейти на игровую площадку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...