这里发生了什么?!?我将失去理智

时间:2019-05-22 18:58:32

标签: python random

我正在运行下面提到的python代码,控制台会显示类似这样的内容:

sim是:[1 0 1 1 1 1 1 0 1 0]

counter_one是3

counter_zero为7

但是让我感到奇怪的是,当我不时地再次运行代码时,计数器是正确的。

import numpy as np

from fractions import Fraction

elements = np.array([1, 0])

prob_of_functioning = Fraction(2, 3)
prob_of_failing = Fraction(1, 3)
probabilities = [prob_of_functioning, prob_of_failing]

sim = np.random.choice(elements, 10, p=probabilities)

print("sim is:")
print(sim)

counter_one = 0
counter_zero = 0

for k in sim:
    if sim[k] == 1:
        counter_one = (counter_one + 1)
    if sim[k] == 0:
        counter_zero = (counter_zero + 1)


print("counter_one is")
print(counter_one)

print("counter_zero is")
print(counter_zero)

2 个答案:

答案 0 :(得分:2)

在python中,for循环无法像C / Java语言那样工作,例如

 for (int k=0; k<len(sim); k++)

迭代sim本身的元素。

所以,您可以直接写

for value in sim:
    if value == 1:
         count_ones += 1
    elif value == 0:
         count_zeros += 1

要遍历索引,请写

 for index in range(len(sim)):

代替

或更(惯用的)

for index, value in enumerate(sim)

遍历值和索引

答案 1 :(得分:0)

在此代码块中:

for k in sim:
    if sim[k] == 1:
        counter_one = (counter_one + 1)
    if sim[k] == 0:
        counter_zero = (counter_zero + 1)

您似乎认为k是一个索引。不是。 k代表sim

的元素

range(len(sim))将为您解决此问题,但是对这样的数组进行迭代是不明智的。重新格式化代码以按元素而不是按索引工作。