Exemplo n.º 1
0
//    int d = System.Enum.GetNames(typeof(d)).Length;
    public static int Rand(float[] weight)
    {
        // 양수화
        {
            float minValue = float.MaxValue;

            for (int i = 0; i < weight.Length; ++i)
            {
                if (weight[i] < minValue)
                {
                    minValue = weight[i];
                }
            }

            if (minValue < 0f)
            {
                for (int i = 0; i < weight.Length; ++i)
                {
                    weight[i] -= minValue;
                }
            }
        }

        // 정규화, 0에서 1까지 증가하는 방식으로.
        float[] normalizedIncreasingWeight = new float[weight.Length];
        {
            float sumWeight = 0f;

            for (int i = 0; i < weight.Length; ++i)
            {
                sumWeight += weight[i];
            }

            for (int i = 0; i < weight.Length; ++i)
            {
                normalizedIncreasingWeight[i] = weight[i] / sumWeight;
                if (i > 0)
                {
                    normalizedIncreasingWeight[i] += normalizedIncreasingWeight[i - 1];
                }
            }
        }

        //

        float r = Rand(0f, 1f);

        for (int i = 0; i < normalizedIncreasingWeight.Length; ++i)
        {
            if (normalizedIncreasingWeight[i] >= r)
            {
                return(i);
            }
        }

        CustomLog.CompleteLogError("Assert");

        return(0);
    }