我有以下功能,其產生2個邊界之間的均勻分佈的值:在分數[T]的方法使用雙值
def Uniform(x: Bounded[Double], n: Int): Bounded[Double] = {
val y: Double = (x.upper - x.lower) * scala.util.Random.nextDouble() + x.lower
Bounded(y, x.bounds)
}
和有界的定義如下:
trait Bounded[T] {
val underlying: T
val bounds: (T, T)
def lower: T = bounds._1
def upper: T = bounds._2
override def toString = underlying.toString + " <- [" + lower.toString + "," + upper.toString + "]"
}
object Bounded {
def apply[T : Numeric](x: T, _bounds: (T, T)): Bounded[T] = new Bounded[T] {
override val underlying: T = x
override val bounds: (T, T) = _bounds
}
}
然而,我想Uniform
工作在所有的Fractional[T]
值,所以我想添加一個上下文綁定:
def Uniform[T : Fractional](x: Bounded[T], n: Int): Bounded[T] = {
import Numeric.Implicits._
val y: T = (x.upper - x.lower) * scala.util.Random.nextDouble().asInstanceOf[T] + x.lower
Bounded(y, x.bounds)
}
這樣做會在執行Uniform[Double](x: Bounded[Double])
時膨脹,但其他方法不可能,並且在運行時得到ClassCastException,因爲它們不能被轉換。有沒有辦法解決這個問題?
你期望有多少種不同類型的「T」?如果這是一個有限的集合,你可以考慮做一個'nextRandom [T]'函數。這隻有在你知道什麼樣的'T'期望時纔有效。 –