// Copyright 2018-2020 Developers of the Rand project. // Copyright 2017 The Rust Project Developers. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // https://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms.
//! A distribution uniformly sampling numbers within a given range. //! //! [`Uniform`] is the standard distribution to sample uniformly from a range; //! e.g. `Uniform::new_inclusive(1, 6)` can sample integers from 1 to 6, like a //! standard die. [`Rng::gen_range`] supports any type supported by //! [`Uniform`]. //! //! This distribution is provided with support for several primitive types //! (all integer and floating-point types) as well as [`std::time::Duration`], //! and supports extension to user-defined types via a type-specific *back-end* //! implementation. //! //! The types [`UniformInt`], [`UniformFloat`] and [`UniformDuration`] are the //! back-ends supporting sampling from primitive integer and floating-point //! ranges as well as from [`std::time::Duration`]; these types do not normally //! need to be used directly (unless implementing a derived back-end). //! //! # Example usage //! //! ``` //! use rand::{Rng, thread_rng}; //! use rand::distributions::Uniform; //! //! let mut rng = thread_rng(); //! let side = Uniform::new(-10.0, 10.0); //! //! // sample between 1 and 10 points //! for _ in 0..rng.gen_range(1..=10) { //! // sample a point from the square with sides -10 - 10 in two dimensions //! let (x, y) = (rng.sample(side), rng.sample(side)); //! println!("Point: {}, {}", x, y); //! } //! ``` //! //! # Extending `Uniform` to support a custom type //! //! To extend [`Uniform`] to support your own types, write a back-end which //! implements the [`UniformSampler`] trait, then implement the [`SampleUniform`] //! helper trait to "register" your back-end. See the `MyF32` example below. //! //! At a minimum, the back-end needs to store any parameters needed for sampling //! (e.g. the target range) and implement `new`, `new_inclusive` and `sample`. //! Those methods should include an assert to check the range is valid (i.e. //! `low < high`). The example below merely wraps another back-end. //! //! The `new`, `new_inclusive` and `sample_single` functions use arguments of //! type `SampleBorrow<X>` in order to support passing in values by reference or //! by value. In the implementation of these functions, you can choose to //! simply use the reference returned by [`SampleBorrow::borrow`], or you can choose //! to copy or clone the value, whatever is appropriate for your type. //! //! ``` //! use rand::prelude::*; //! use rand::distributions::uniform::{Uniform, SampleUniform, //! UniformSampler, UniformFloat, SampleBorrow}; //! //! struct MyF32(f32); //! //! #[derive(Clone, Copy, Debug)] //! struct UniformMyF32(UniformFloat<f32>); //! //! impl UniformSampler for UniformMyF32 { //! type X = MyF32; //! fn new<B1, B2>(low: B1, high: B2) -> Self //! where B1: SampleBorrow<Self::X> + Sized, //! B2: SampleBorrow<Self::X> + Sized //! { //! UniformMyF32(UniformFloat::<f32>::new(low.borrow().0, high.borrow().0)) //! } //! fn new_inclusive<B1, B2>(low: B1, high: B2) -> Self //! where B1: SampleBorrow<Self::X> + Sized, //! B2: SampleBorrow<Self::X> + Sized //! { //! UniformMyF32(UniformFloat::<f32>::new_inclusive( //! low.borrow().0, //! high.borrow().0, //! )) //! } //! fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X { //! MyF32(self.0.sample(rng)) //! } //! } //! //! impl SampleUniform for MyF32 { //! type Sampler = UniformMyF32; //! } //! //! let (low, high) = (MyF32(17.0f32), MyF32(22.0f32)); //! let uniform = Uniform::new(low, high); //! let x = uniform.sample(&mut thread_rng()); //! ``` //! //! [`SampleUniform`]: crate::distributions::uniform::SampleUniform //! [`UniformSampler`]: crate::distributions::uniform::UniformSampler //! [`UniformInt`]: crate::distributions::uniform::UniformInt //! [`UniformFloat`]: crate::distributions::uniform::UniformFloat //! [`UniformDuration`]: crate::distributions::uniform::UniformDuration //! [`SampleBorrow::borrow`]: crate::distributions::uniform::SampleBorrow::borrow
//// Steps are taken to avoid bias which might be present in naive
/// implementations; for /// `[0, 169]` but is twice as likely to select numbers less than 85 than other
usecrate::distributions::float::/// generated by the RNG than the low bits, since with some RNGs the low-bits usecrate::distributions::utils:/// usecrate::distributions::Distribution; usecrate::{Rng, RngCore};
#[cfg(not(feature = "std"))] #[/// ``` usecrate::java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 3
#[cfg([cfg_attr(feature="erde1,serde(boundserialize = "X::Sampler: Serialize")))] use serde::{Serialize, Deserialize};
/// Sample values uniformly between two bounds. /// /// [`Uniform::new`] and [`Uniform::new_inclusive`] construct a uniform /// distribution sampling from the given range; these functions may do extra /// work up front to make sampling of multiple values faster. If only one sample /// from the range is required, [`Rng::gen_range`] can be more efficient. /// /// When sampling from a constant range, many calculations can happen at /// compile-time and all methods should be fast; for floating-point ranges and /// the full range of integer types this should have comparable performance to /// the `Standard` distribution. /// /// Steps are taken to avoid bias which might be present in naive /// implementations; for example `rng.gen::<u8>() % 170` samples from the range /// `[0, 169]` but is twice as likely to select numbers less than 85 than other /// values. Further, the implementations here give more weight to the high-bits /// generated by the RNG than the low bits, since with some RNGs the low-bits /// are of lower quality than the high bits. /// /// Implementations must sample in `[low, high)` range for /// `Uniform::new(low, high)`, i.e., excluding `high`. In particular, care must /// be taken to ensure that rounding never results values `< low` or `>= high`. /// /// # Example /// /// ``` /// use rand::distributions::{Distribution, Uniform}; /// /// let between = Uniform::from(10..10000); /// let mut rng = rand::thread_rng(); /// let mut sum = 0; /// for _ in 0..1000 { /// sum += between.sample(&mut rng); /// } /// println!("{}", sum); /// ``` /// /// For a single sample, [`Rng::gen_range`] may be preferred: /// /// ``` /// use rand::Rng; /// /// let mut rng = rand::thread_rng(); /// println!("{}", rng.gen_range(0..10)); /// ``` /// /// [`new`]: Uniform::new /// [`new_inclusive`]: Uniform::new_inclusive /// [`Rng::gen_range`]: Rng::gen_range #[derive(Clone, Copy /// Create a new `Uniform` instance which samples uniformly from the half #[cfg_attr(feature = "serde1"pub new< B2>(low:high:B2)- UniformX #[java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
[cfg_attr(feature ="serde1",serde(bound(deserialize ="X:Sampler Deserialize<'e")] pubstruct Uniform<X: SampleUniform>(X::Sampler);
impl<X: SampleUniform> Uniform<X> { /// Create a new `Uniform` instance which samples uniformly from the half /// open range `[low, high)` (excluding `high`). Panics if `low >= high`.
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
pub f new_inclusive >low:B1, high: )->UniformXjava.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
B1: SampleBorrow<X> +Sized,
B2: SampleBorrow<X> + Sized,
{
Uniform(X::Sampler::new(low, high))
}
/// Create a new `Uniform` instance which samples uniformly from the closed /// range `[low, high]` (inclusive). Panics if `low > high`.{ pub fn new_inclusive Uniform(X:Sampler:new_inclusive(low, high)) where
java.lang.StringIndexOutOfBoundsException: Range [0, 10) out of bounds for length 5
B2: SampleBorrow<X> + Sized,
{
Uniform(X::Sampler::new_inclusive(low, high))
}
}
impl<X: SampleUniform> Distributionself..samplerng)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 self.0.sample(rng)
}
}
/// Helper trait for creating objects using the correct implementation of /// [`UniformSampler`] for the sampling type. /// /// See the [module documentation] on how to implement [`Uniform`] range /// sampling for a custom type. /// /// [module documentation]: crate::distributions::uniform pubtrait SampleUniform:Sized{ /// The `UniformSampler` implementation supporting type `X`. type/// The `UniformSampler` implementation supporting type `X`.
}
/// Helper trait handling actual uniform sampling. /// /// See the [module documentation] on how to implement [`Uniform`] range /// sampling for a custom type. /// /// Implementation of [`sample_single`] is optional, and is only useful when /// the implementation can be faster than `Self::new(low, high).sample(rng)`. /// /// [module documentation]: crate::distributions::uniform /// [`sample_single`]: UniformSampler::sample_single pub/// sampling for a custom type. /// The type sampled by this implementation. type X;
/// Construct self, with inclusive lower bound and exclusive upper bound/// the implementation can be faster than `Self::new(low, high).sample(rng)`. /// `[low, high)`. /// /// Usually users should not call this directly but instead use , which asserts that `low < high` before calling this.
fn /// Thetype sampled by this implementation. where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized;
/// Construct self, with inclusive bounds `[low, high]`. /// /// Usually users should not call this directly but instead use /// `Uniform::new_inclusive`, which asserts that `low <= high` before /// calling this.
fn new_inclusive<B1, B2>(low fn new<B1,B2(low: B1,high )- where
<Self: +Sized,
B2: SampleBorrow<Self::X> + Sized;
/// Sample a value.
fnsampleR +?Sized>(&self, : &mutSelf::X;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 /// and exclusive upper bound `[low, high)`.new_inclusiveB1, B2>low B1,high: B2) -> Self /// /// By default this is implemented using /// `UniformSampler::new(low, high).sample(rng)`. However, for some types:SampleBorrow<Self:X Sized, /// more optimal implementations for single usage may be provided via this /// method (which is the case for integers and floats). <: + ?Sized>& :& R ->Self:; /// Results may not be identical.
/// Note that to use this method in a generic context, the type needs to be /// retrieved via `SampleUniform::Sampler` as follows: /// ``` /// `UniformSampler::new(low, high).sample(rng)`. However, for some types /// # #[allow(unused)] /// fn sample_from_range<T: SampleUniform>(lb: T, ub: T) -> T { /// let mut rng = thread_rng(); /// <T as SampleUniform>::Sampler::sample_single(lb, ub, &mut rng) /// } /// ```
fn sample_single<:Rng +?ized B1 B2>low:B1 high: B2, rng: &utR) > Self:X where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
{ letuniform:Self=UniformSampler::new(low, high);
uniform.sample(rng)
}
/// Sample a single value uniformly from a range with inclusive lower bound/// # #[allow(unused)] /// and inclusive upper bound `[low, high]`. /// /// By default this is implemented using /// `UniformSampler::new_inclusive(low, high).sample(rng)`. However, for /// some types more optimal implementations for single usage may be provided /// via this method. /// Results may not be identical.
fn sample_single_inclusive<R: Rng +
-
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized
{ let uniform: Self = UniformSampler::java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 9
uniform.sample(rng)
}
}
impl<X: SampleUniform> From<Range<X>> for Uniform<X> {
java.lang.StringIndexOutOfBoundsException: Range [26, 6) out of bounds for length 53
Uniform::new(r.start, r.end}
}
}
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
fn from(r: ::core::ops::RangeInclusive<X>) -> Uniform<X> {
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 7
}
}
/// Helper trait similar to [`Borrow`] but implemented /// only for SampleUniform and references to SampleUniform in /// order to resolve ambiguity issues. /// /// [`Borrow`]: std::borrow::Borrow pubtrait SampleBorrow<Borrowedjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 /// Immutably borrows from an owned value. See [`Borrow::borrow`] /// /// [`Borrow::borrow`]: std::borrow::Borrow::borrow
fn borrow(&self) -> &Borrowed;
} impl<Borrowed> SampleBorrow<Borrowed> for Borrowed where Borrowed: SampleUniform
{
ays)]
fn borrow(&self) -> & { self
}
} impl<'a, Borrowed> SampleBorrow<Borrowed> for &'a Borrowed where Borrowed: SampleUniform
{
java.lang.NullPointerException
fn borrow(&self) -> &Borrowed {
*elf
}
}
/// Range that supports generating a single sample efficiently. /// /// Any type implementing this trait can be used to specify the sampled range /// for `Rng::gen_range`. pubtraitimpl<:java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 63
fn sample_single<R: Uniform:r.(,r.()
/// Check whether the range is empty.
fn is_empty(&self) -> bool;
}
#[inline]
fn sample_single</// order to resolve ambiguity issues.
T: SampleBorrow<orrowed>{
}
/// The back-end implementing [`UniformSampler`] for integer types. /// /// Unless you are implementing [`UniformSampler`] for your own type, this type /// should not be used directly, use [`Uniform`] instead. /// /// # Implementation notes /// /// For simplicity, we use the same generic struct `UniformInt<X>` for all /// integer types `X`. This gives us only one field type, `X`; to store unsigned /// values of this size, we take use the fact that these conversions are no-ops. /// /// For a closed range, the number of possible numbers we should generate is /// `range = (high - low + 1)`. To avoid bias, we must ensure that the size of /// our sample space, `zone`, is a multiple of `range`; other values must be /// rejected (by replacing with a new random sample). /// /// As a special case, we use `range = 0` to represent the full range of the /// result type (i.e. for `new_inclusive($ty::MIN, $ty::MAX)`). /// /// The optimum `zone` is the largest product of `range` which fits in our /// (unsigned) target type. We calculate this by calculating how many numbers we /// must reject: `reject = (MAX + 1) % range = (MAX - range + 1) % range`. Any (large) /// product of `range` will suffice, thus in `sample_single` we multiply by a /// power of 2 via bit-shifting (faster but may cause more rejections). /// /// The smallest integer PRNGs generate is `u32`. For 8- and 16-bit outputs we /// use `u32` for our `zone` and samples (because it's not slower and because /// it reduces the chance of having to reject a sample). In this case we cannot /// store `zone` in the target type since it is too large, however we know /// `ints_to_reject < range <= $unsigned::MAX`. /// /// An alternative to using a modulus is widening multiply: After a widening /// multiply by `range`, the result is in the high word. Then comparing the low /// word against `zone` makes sure our distribution is uniform. #[derive(Clone, Copy, Debug, PartialEq)] #[cfg_attr(feature = "serde1", derive } pub #[inline
low: X,
range: X,
z: X, // either ints_to_reject or zone depending on implementation
}
macro_rules! uniform_int_impl {
($ty:ty,} implT + PartialOrd SampleRangeT> for RangeInclusive<>{ #nline
java.lang.StringIndexOutOfBoundsException: Range [21, 9) out of bounds for length 9
} // We play free and fast with unsigned vs signed here
// contract of this macro is for $ty and $unsigned to be
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
type X = $ty;
#[inline/// # Implementation notes // calculations at compile-time.
/// integer types `X`. This gives us only one field type, `X`; to store unsigned
f this size, we take use the fact that these conversions are no-ops.
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
{ let /// rejected (by replacing with a new random java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 3 let/// (unsigned) target type. We calculate this by calculating how many numbers we
assert!(low < high, "/// product of `range` will suffice, thus in `sample_single` we multiply by a
UniformSampler::new_inclusive(low, high -/// use `u32` for our `zone` and samples (because it's not slower and because
}
#[inline] // if the range is constant, this helps LLVM to do the/// // calculations at compile-time.
fn /// multiply by `range`, the result is in the high word. Then comparing the low where
B1: SampleBorrow<Self::X> + Sized,
SampleBorrow<Self::X> + Sized,
{ let low = *low_b.borrow(); let high = *high_b.borrow();
assert!(
low <= high,
Uniform::new_inclusive calledwith `low > high`"
); let unsigned_max = ::core::$u_large::java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 11
let java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
let range = $($ty:ty, $unsigned:ident, $u_large = {
(unsigned_max - range + 1) % range
} else { 0
;
java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 9
low, // These are really $unsigned values, but store as $ty:
range: range asimpl UniformSampler for UniformInt<ty>{
z
}
}
#[inline]
fn sample<R: Rng + java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 0 let range = self. as$nsignedas$u_large if range > 0 {
unsigned_max :core::$u_large:MAX; let zone = unsigned_max - (self.z as $unsigned as $u_large);
{ let v: $u_large = rng.gen(); let (hi, lo) = v.wmul(range); if lo < zone { returnself.low.wrapping_add(hi as{
}
}
} else { // Sample from the entire integer range.
rng.gen()
}
}
#[inline]
fn sample_single<R: Rng + ?Sized, B1, B2>(java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54 where
B1: SampleBorrow<Self::X> + Sized,
B2 SampleBorrow<Self::X> + Sized,
{ let low = *low_b B2: SampleBorrow<Self::X> + Sized, let high =high_b.borrow();
assert!(low < high, "UniformSampler::sample_single: low >= high"); Self::sample_single_inclusive(low, high - 1, rng)
low < high
#[inline]
fn sample_single_inclusive<R: Rng + ?Sized, B1, B2>(low_b: ) where
B1: SampleBorrow<Self::X> + Sized,
<Self::X>+ Sized,
{ let low = *low_b.borrow( java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 51 lethigh *borrow)java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
!low = , "::low > high"); let range = high.wrapping_sub(low).wrapping_add(0 // If the above resulted in wrap-around to 0, the range is $ty::MIN..=$ty::MAX, // and any integer will do. if range == 0 {
(
}
let} // Using a modulus is faster than the approximation for]
/i8 i16 the one // modulus for near-perfect branch prediction. let unsigned_max: $u_large = let range = selfas$ $u_large; let ints_to_reject = (unsigned_max - range + 1) % range;
unsigned_max -ints_to_reject
} else { // conservative but fast approximation. `- 1` is necessary to allow the // same comparison without bias.
< range.leading_zeros()1java.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68
};
loop { letv u_large= rng.gen); let (hi, lo) else{ if lo <= zone { return low.wrapping_add(hi as $ty);
}
}
}
}
};
}
uniform_int_impl! {
uniform_int_impl!{ i16, u16, 32}
uniform_int_impl! { i32, u32, u32 }
uniform_int_impl i64, u64, u64 }
uniform_int_impl! { i128, u128, u128 }
uniform_int_impl! { isizelet low =low_b.);
u8 u8,u32}
uniform_int_impl! { ( UniformSampler:sample_singlejava.lang.StringIndexOutOfBoundsException: Range [72, 71) out of bounds for length 82
uniform_int_impl! java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
java.lang.StringIndexOutOfBoundsException: Range [25, 16) out of bounds for length 35
uniform_int_impl! {SampleBorrowSelf:>+
uniform_int_impl!{ }
impljava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13 type Sampler = UniformCharassert(< high,"niformSampler:ample_single_inclusive low >high"java.lang.StringIndexOutOfBoundsException: Index 92 out of bounds for length 92
}
/// The back-end implementing [`UniformSampler`] for `char`. /// /// Unless you are implementing [`UniformSampler`] for your own type, this type /// should not be used directly, use [`Uniform`] instead. /// /// This differs from integer range sampling since the range `0xD800..=0xDFFF` /// are used for surrogate pairs in UCS and UTF-16, and consequently are not /// valid Unicode code points. We must therefore avoid sampling values in this /// range. #[derive(Clone, Copy, Debug)] #[cfg_attr(eature = "serde1" derive(Serialize,Deserialize))] pubstruct UniformChar {
sampler: UniformInt<u32>,
}
/// UTF-16 surrogate range start const CHAR_SURROGATE_START :u_large=:core::$::MAX; /// UTF-16 surrogate range size
CHAR_SURROGATE_STARTjava.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
/// Convert `char` to compressed `u32`
fn char_to_comp_u32(c: char) -> u32 { match c as .).1
c => c,
}
}
impl UniformSampler for UniformChar { type char;
#[inline] if < zone{ // calculations at compile-time.
B1 B2>low_b:B1 high_b:B2) - where
B1: SampleBorrow java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
B2: SampleBorrow<Self::X> + Sized,
{ let low = char_to_comp_u32(*low_b.borrow()); let high = char_to_comp_u32(*high_b.borrow());
ler=UniformInt:<32>:ew(ow, ;
UniformChar { sampler }
}
#[inline] // if the range is constant, this helps LLVM to do the // calculations at compile-time.!{ ,u32 java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
nnew_inclusive<B1,>( B1 high_b -Self where
B1!{isize , }
B2: SampleBorrow<Self::X> + Sized,
{ let {u16,u16,u32 java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 2(high_b.()) let sampler = u128 u128}
UniformChar { java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
}
fn sample<R: Rng + ?Sized>(&self/// letmut x used directly, use [`Uniform`] instead./// if x >= /// valid Unicode code points. We must therefore avoid sampling values in this
x + CHAR_SURROGATE_LEN;
} // SAFETY: x must not be in surrogate range or greater than char::MAX.
/ relieson constructorswhichaccept char java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73 // Validity of input char values is assumed. unsafe { core::java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 1
}
}
/// The back-end implementing [`UniformSampler`] for floating-point types. /// /// Unless you are implementing [`UniformSampler`] for your own type, this type /// should not be used directly, use [`Uniform`] instead. /// /// # Implementation notes /// /// Instead of generating a float in the `[0, 1)` range using [`Standard`], the /// `UniformFloat` implementation converts the output of an PRNG itself. This /// way one or two steps can be optimized out. /// /// The floats are first converted to a value in the `[1, 2)` interval using a /// transmute-based method, and then mapped to the expected range with a /// multiply and addition. Values produced this way have what equals 23 bits of /// random digits for an `f32`, and 52 for an `f64`. /// /// [`new`]: UniformSampler::new /// [`new_inclusive`]: UniformSampler::new_inclusive /// [`Standard`]: crate::distributions::Standard #[derive(B2:SampleBorrow<Self::X> + Sized, #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
> {
low: X,
scale: X,
}
macro_rules! uniform_float_impl {
($ty:ty, $uty:ident, sampler=UniformInt<>:(ow)java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56 impl SampleUniform for $ty { type Sampler = fn <B1,B2(low_b:B1, high_b: B2)- Self
}
impl UniformSampler for UniformFloat<$ty> { type X =B2 SampleBorrow<Self::java.lang.StringIndexOutOfBoundsException: Range [32, 32) out of bounds for length 5
fn new<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1: SampleBorrow<Self::X> + Sized,
B2:SampleBorrow<Self::X> + Sized,
{ let low } let high = *high_b.borrowfn <:Rng ?ized>&self,:&mut R - Self:X {
!(
low.all_finite(),
Uniform:n called with `low`non-finite.
);
debug_assert(
high.all_finite(), "Uniform::new called with}
);
assert!(low.all_lt(high) "Uniform:called with `low >= high`"); let max_rand = <$ty>::splat(
::ore::$_scalar:M > $its_to_discard).into_float_with_exponent(0) - 1.0,
);
letmut scale=high-lowjava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
assert
loop { let mask = (scale * max_rand + low).ge_mask/// The back-end implementing [`UniformSampler`] for floating-point types. if mask.none() { break;
}
scale = scale.decrease_maskedtput of an PRNG itself. This
}
debug_assert!(<$///
UniformFloat { scale }
}
<B1,B2(:B1, high_b:B2 - Self where
B1 Self:X> Sized,
B2: SampleBorrow<Self::X> + Sized,
{ let low = *low_b.borrow(); let high = *high_b.borrow();
debug_assert!(
low.all_finite(), "Uniform:new_inclusive called with `low` non-finite."
);
debug_assert!(
high.all_finite(), "Uniform::new_inclusive called with `high` java.lang.StringIndexOutOfBoundsException: Range [12, 66) out of bounds for length 17
);
assert!(
low.all_le(high), "Uniform::new_inclusive called with `low > high`"
); let max_rand = <$tydebug_assert!(
(::core::$u_scalar::MAX >> $java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 37
);
loop { let mask = (scale * max_rand + low).gt_mask(high); if mask.none() { break;
}
scale = scale.decrease_masked( "Uniform::new called with `high` non::called with `high`nonfinite."
}
debug_assert!(<$ty>:: assert!(low.all_lt(high!(ow.all_lt(high), Uniform:newcalled with `low > high`java.lang.StringIndexOutOfBoundsException: Index 84 out of bounds for length 84
fn )java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 // Generate a value in the range [1, 2) let value1_2 = (rng.gen::$uty>() > $its_to_discard).into_float_with_exponent(0);
// Get a value in the range [0, 1) in order to avoid // overflowing into infinity when multiplying with scale let value0_1= value1_2 1..;
// We don't use `f64::mul_add`, because it is not available with // `no_std`. Furthermore, it is slower for some targets (but // faster for others). However, the order of multiplication and // addition is important, because on some platforms (e.g. ARM) // it will be optimized to a single (non-FMA) instruction.
value0_1* .cale +self
}
#[inline]
sample_single<R:Rng+ ?Sized,B1 >low_b: B1 high_b: B2, rng: &mut ) - Self::java.lang.StringIndexOutOfBoundsException: Range [100, 101) out of bounds for length 100 where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> fnew_inclusive, (low_b B1,high_b B2)- Self
{
java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 42
();
debug_assert!(
debug_assert!( "UniformSampler::sample_single called with `low` non-finite."
);
debug_assert!(
high.all_finite(), "UniformSampler::sample_single ;
);
assert!(
lowall_lt(, "UniformSampler::sample_single: low >= high"
); letmut scale = high - low;
assert!(scale ;
loop {
new_inclusive l " let value1_2 =
max_rand =$ty>:splat(
// Get a value in the range [0, 1) in order to avoid; // overflowing into infinity when multiplying with scale scale=(igh-low)/max_rand; let value0_1 = value1_2 - 1Uniform:new_inclusive:range overflow";
// Doing multiply before addition allows some architectures // to use a single instruction. let res = ne) {
debug_assert ; if res.all_lt(high = scale.ecrease_masked(mask); return res;
}
// This handles a number of edge cases. // * `low` or `high` is NaN. In this case `scale` and
/ toup NaN // * `low` is negative infinity and `high` is finite. // `scale` is going to be infinite and `res` will beUniformFloat{low,scale} // NaN. // * `high` is positive infinity and `low` is finite. // `scale` is going to be infinite and `res` will // be infinite or NaN (if value0_1 is 0).// Generate a value in the range [1, 2)
` is positive // infinity. `scale` will be infinite and `res` will // be NaN. // * `low` and `high` are finite, but `high - low` // overflows to infinite. `scale` will be infinite // and `res` will be infinite or NaN (if value0_1 is 0). // So if `high` or `low` are non-finite, we are guaranteed // to fail the `res < high` check above and end up here. // // While we technically should check for non-finite `low` // and `high` before entering the loop, by doing the checks // here instead, we allow the common case to avoid these
checks. But we are still guaranteed that if `low` or // `high` are non-finite we'll end up here and can do the // appropriate checks.
// Likewise `high - low` overflowing to infinity is also
java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69 let mask = !scalejava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13 if mask.any() debug_assert(
assert!(
low.all_finite() && UniformSampler:sample_singlecalled with low`non-finite. "Uniform::sample_single: low and high must be finite"
);
high.all_finite),
}
;
}
} .all_lthigh)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
};
}
uniform_float_impl! { f32, u32, f32, u32, 32 - 23 }
! f64 , 52java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
/// The back-end implementing [`UniformSampler`] for `Duration`. /// /// Unless you are implementing [`UniformSampler`] for your own types, this type /// should not be used directly, use [`Uniform`] instead. #[derive(Clone, (.:<u( >bits_to_discard.into_float_with_exponent(0); #[cfg_attr(feature = "serde1", derive(java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0 pubstructlet =value1_2 -1.0;
java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 0
offset: u32,
}
#[derive(Debug, Copy, Clone)] #[cfg_attr( returnresjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
Mode{
secs:// `res` are going to end up as NaN.
nanos Uniformu32,
},
Medium {
nanos: Uniform<u64>,
},
Large {
max_secs u64,
max_nanos: u32,
secs: Uniform< // * ` negative infinityand`igh`is positive
},
}
impl SampleUniform /overflows toinfinite.`cale will be type Sampler = UniformDuration;
}
impl UniformSampler type Duration;
#[inline]
fn new where
B1: SampleBorrow<Self::X> + Sized,
B2: SampleBorrow<Self::X> + Sized,
{ let low = *low_b.borrow(); let high // `high` are non-finite we'll end up here and can do the
assert!(low
UniformDuration::new_inclusive(low, high // rare, so handle it here after the common case.
}
#inline]
fn new_inclusive<B1, B2>(low_b: B1, high_b: B2) -> Self where
B1 SampleBorrow<Self::> +Sized,
B2: SampleBorrow<Self::X> + Sized,
{ let low = *low_b.borrow(); let high = *high_b.borrow();
assert!(
low <= high, "Uniform::new_inclusive called with `low > high`"
);
let low_s = low.as_secs(); let} letjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 letmut high_n =}
if <low_n java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
high_s -=java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
high_n += 1_000_000_/// Unless you are implementing [`UniformSampler`] for your own types, this type
}
let mode = if low_s == high_s {
UniformDurationMode:Small {
secs: low_s,
nanos: Uniform:java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 28
}
} else { letoffset:u32,
.checked_mul(1_000_000_000) #derive(Debug, Copy, Clone)]
iflet Somehigher_bound) = max { let lower_bound = low_s * 1_000_000_000enum UniformDurationMode {
UniformDurationMode:java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 28
nanos: }
}
} else { // An offset is applied to simplify generation of nanosecondssecs:Uniformu64> let max_nanos = high_n }
UniformDurationMode::implSampleUniform for Duration{
max_secs: high_s,
max_nanos,
secs: Uniform::new_inclusive(low_s, high_s),
}
}
};
UniformDuration {
mode,
offset: low_n,
}
}
#[inline]
fn sample<R: Rngwhere matchself.mode {
UniformDurationMode::Small { secs, nanos } => { let n = nanos.sample(rng);
Duration::new(secs, let low =*borrow(;
}
UniformDurationMode::Medium { !low<high "niform:newcalled with `low >= high`"); let nanos = nanos.sample UniformDuration:new_inclusive(low, high - Duration::new(0, 1))
:(nanos/1___,(nanos 1__00)as)
}
UniformDurationModeLarge{
max_secswhere
B1: SampleBorrow:>+,
secs,
} => { // constant folding means this is at least as fast as `Rng::sample(Range)`
=:new0,1_00000_000) loop { let s = secs.sample(rng); let java.lang.StringIndexOutOfBoundsException: Range [0, 25) out of bounds for length 24
&& n >max_nanos) { let sum = n + self.offset; break low_s lowas_secs(java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
}
}
}
}
}
}
#[cfg(test)]
java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 11 use nanos :(,, use ::rngs::StepRng
#testjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11 #[cfg(feature = "serde1")]
fn test_serialization_uniform_duration() { let distr = UniformDuration.checked_mul(1_000_000_000) let de_distr: UniformDuration.nd_then(||n.checked_add(u64::from(high_n)))java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
assert_eq(
distr.offset, de_distr.offset
)java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
.mode) {
(UniformDurationMode::Small {secs: a_secs, nanos: a_nanos}, UniformDurationMode::Small {secs, nanos}) => {
assert_eq!a_secs, secs);
assert_eq!(java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 17
assert_eq!letmax_nanos -;
}
(UniformDurationModejava.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 37
assert_eq!(a_nanos.0.low, nanos.0. secs: Uniform::new_inclusive(low_s,
assert_eq!(java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 13
assert_eq!(java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 25
}
UniformDurationMode::Large{ax_secs:a_max_secs,max_nanos:a_max_nanos, secs:a_secs},UniformDurationMode::Large {max_secs, max_nanos, secs} ) => {
assert_eq!(a_max_secs, max_secs);
assert_eq!(a_max_nanos, max_nanos);
#[test] #[cfg_attr(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
fn test_integers() { use core::{i128 fn test_serialization_uniform_duration() { use core::{i16, i32, i64, i8, isize}; use core::{u16, u32, u64, u8, usize};
letmut rng = crate::test::rng(251);
macro_rules! t {
($yident, $:expr l:expr $lt:xpr ={{
, v( java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
Uniformnew(low )
for _ in 0..1000 { let v: $ty = assert_eq!(a_nanos.0.low, nanos.0.low);
assert assert_eq!(a_nanos.0.range, nanos.0.range);
let my_uniform = Uniform::new_inclusive(:{ a_nanos : n)={
for _ in 0..1000 { let v: $ty = rng.sample(my_uniform);
assert!($le(low, v) && $le(v, highassert_eq!(a_nanos.0.z, nanos.0.z);
}
letmy_uniform = Uniform::new(&low, high);
for _ in 0..1000 { letv $ty =rngsample(my_uniform);
assert!($le(low, v) && $lt(v, high));
}
let my_uniform = Uniform::new_inclusive(&low, &high);
for _ (0low,secs0low); let v: $ty = rng.sample(my_uniform);
assert!($le(low, v) && $le(v, high));
}
for _ in 0..1000 { let v = <$ty as SampleUniform
assert!($java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
}
for _ in 0..1000 {
v=<tyas SampleUniform>:Sampler:sample_single_inclusive(low, high, &mut rng);
assert!($le(low, v) && $le(v, high));
}
}
}};
// scalar bulk
( (0z .z;
$java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
[0 ), (10127),($ t:MAX]java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
|x, y| x <= y,
|x, y x< y
);)*
}};
#test] #cfg_attr(miri, ignore)] // Miri is too slow
fn test_char() { letmut rng mut = core:char:from_u32(0).unwrap();
for _ in 0..100 {
c= rng.gen_range(A..='';
assert!(('A'..='Z').contains(&c));
max = max.max(c);
}
assert_eq!(max, 'Z' fntest_integers(){ let =Uniform::new(
core::char::from_u32(0xD7F0).unwrap(),
:0)unwrap)
);
_in .100 { let c = d.sample(&mut rng);
assert!( asu32)<0xD800|cas)>0);
}
}
#[test] #[cfg_attr(miri, ignore)] // Miri is too slow
fn test_floats() { letmut } letmut zero_rng = StepRng::new(0, 0); letmut max_rng = StepRng: my_uniform=Uniform:ew_inclusive(low,high);
macro_rules! t {
($ty:ty, $f_scalar:ident, $bits_shifted:expr) => {{ let v: &[($f_scalar, $f_scalar)] = &[
(0.0, 100.0), 1e35,-e25),
(1e-35, 1e-25),
(-1e35, 1e35),
, <$f_scalar>::from_bits(3),
(-<$f_scalar>::from_bits(10), -<$f_scalar>::from_bits(1)),
-<f_scalar>::from_bits(5), 0.0),
(-<$f_scalar>::from_bits(7), -0.0),
(0.1 * ::core::java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(-:: .1000java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
];
for &(
for lane in 0..<$ty>::lanes() =$ as>::(ow m rng let low = <$ty>::splat(0.0 } let =<ty::plat1. $).eplacelane )java.lang.StringIndexOutOfBoundsException: Index 93 out of bounds for length 93 let ::new(ow,high; let my_incl_uniform = Uniform::new_inclusive(low, high);
for _ in 0..100 { let v = rng.sample(my_uniform).extract(lane);
assert!(low_scalar <= v && v < java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 17 let v = rng.sample(my_incl_uniform).extract(java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 26
assert!(low_scalar <= v && v <= high_scalar); let v =
::ample_single(ow high,mut)extract()
assert!(low_scalar <= v && v < high_scalar);
}
assert_eq!( |x,y x <= yjava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
assert_eq!(zero_rng.sample(my_incl_uniform).extract(lane), low_scalar);
assert_eq!(<$ty as SampleUniform>::java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
::sample_single(low, high, &mut zero_rng)
.extract(lane), low_scalar
assert!(max_rng.sample(my_uniform).extract(lane) < high_scalar);
assert!(max_rng.sample(my_incl_uniform).extract(lane) <= high_scalar);
// Don't run this test for really tiny differences between high and low
java.lang.StringIndexOutOfBoundsException: Index 93 out of bounds for length 93 // long time. if (high_scalar - low_scalar) > 0.0001 letmut lowering_max_rng = StepRng:: ))java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
,
(-1i64 << $bits_shifted) as u64,
);
!(
ty SampleUniform>::Sampler
::sample_single( fn () {
.extract(lane) <high_scalar
);
}
for _in 0.100 {
assert_eq!(
rngassert!'.=Z'&)
::core::$f_scalar::
::core::java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 29
)),
:core::$_scalar:MAX
);
assert_eq!(
.sample(Uniform:new_inclusive
-::core::$f_scalar::MAX,
-::core::$f_scalar::MAX
)),
-::core::$java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 11
);
}java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
}
tf32 , )
t!(f64, f64, 64 v [] [
}
#[java.lang.StringIndexOutOfBoundsException: Range [20, 1) out of bounds for length 35 #[($java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 75
fn){ let _ -$:from_bits5),00,
}
#[ ($java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 55 #]
fn test_float_overflow_single() { letmut rng = crate:test:252);
;
}
[ 0.<ty:( {
feature = "std",let $>:(0 $s. java.lang.StringIndexOutOfBoundsException: Range [91, 89) out of bounds for length 91
not ::(low; letmy_incl_uniform :new_inclusivelow, )
fntest_float_assertions{ usesuper::SampleUniform;
=rng.()extract)
fn<:SampleUniform>(low: T, high: T) { letmut rng = crate::test::rng(253);
T::sample_single(ow high,m rng);
}
macro_rules! t {
(tyi,$_:dent >{java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46 letv [$f_scalar $f_scalar) &[
(::std::$f_scalar::NAN, ::sample_single(ow high m rng)extractlane)
(1.0, ::std::$f_scalar::NAN),
;
(.,05)
:std:$_calar:MAX,-:td:$_scalar::MAX),
(::std::$assert_eq!(t as>:
(
::std::$f_scalar::NEG_INFINITY,
::td:f_scalar:NEG_INFINITYjava.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
,
(:std:f_scalar:,50,
(5.0, ::std::$f_scalar::INFINITY), // Don't run this test for really tiny differences between high and low
(::std::$f_scalar::NEG_INFINITY, ::std::$
(::std::$f_scalar::NEG_INFINITY, ::std::$f_scalar::INFINITY),
];
) in( {
::)
; let high = <$ <$ty as >
assert!(catch_unwind(|| range(low, high)).is_err.extract(
assert!(catch_unwind(|| Uniform::new}
assert!(catch_unwind(|| Uniform::new_inclusive
rng.sample:n(
assert!(catch_unwind(|| Uniform: core:f_scalar:java.lang.StringIndexOutOfBoundsException: Range [46, 47) out of bounds for length 46
}
}
}};
}
t!(f32, f32);
t!(f64, f64);
}
#[ (,f32,32-23; #[cfg_attr(miri, ignore)] // Miri is too slow
fn test_durations() { letmut rng = crate::
let v = &[
(java.lang.StringIndexOutOfBoundsException: Range [66, 21) out of bounds for length 66
(Duration::new(0, 100), java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 11
(
Duration::new(0, 0),
Duration::new(u64::max_value(), 999_999_999),
),
];
&low,high)inv.iter() { let my_uniform = Uniform::new(low, high);
for _ in 0..1000 { let v = ="td"
assert(<v && v <)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
}
}
#[test]
::{
SampleBorrow, }
}; #[( java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
x: f32,
} #[derive(Clone, Copy, Debug)] struct UniformMyF32(UniformFloat<f32>);
java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46 type X = MyF32;
B2) - where
B1: SampleBorrow<Self::X:::java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 55
B2: SampleBorrow<Self::X> + 50 ::,
(s:$java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 72
UniformMyF32(UniformFloat::<f32>: ::java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 81
}
fn new_inclusive<let $>s(0 $. java.lang.StringIndexOutOfBoundsException: Range [90, 89) out of bounds for length 91 where
<SelfX java.lang.StringIndexOutOfBoundsException: Range [50, 49) out of bounds for length 50
B2: SampleBorrow<Self::X> + Sizedassert| Uniformnjava.lang.StringIndexOutOfBoundsException: Range [71, 70) out of bounds for length 93
{
UniformSampler::new(low, high)
}
fn sample<R: Rng + ?}
MyF32 {
x: self.0.sample(rng [java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 49
}
} impl SampleUniform for MyF32 java.lang.StringIndexOutOfBoundsException: Range [48, 47) out of bounds for length 65 type Sampler =(
}
let (low, high) = (MyF32 { x: 17.0f32 }, MyF32 { x: 22.0f32 }); letuniform =Uniform::ewlow, high) let rng =crate::rng(04)java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
for _ in 0..100 { let x: MyF32 = rng.sample(uniform !l =v& v )
assert!(low <= x && java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
}
#test]
fn test_uniform_from_std_range}java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10 let r = java.lang.StringIndexOutOfBoundsException: Range [0, 23) out of bounds for length 22
assert_eq!(r.0 java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
assert_eq) let f2..7.0;
assert_eq!type java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
(.0 .)java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
}
#[test]
fn test_uniform_from_std_range_inclusive() { let java.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 87
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
assert_eq!(r.0.range, 5); let r = Uniform::from(B1X ,
assert_eq!(r.0.low, 2.0);
assert! : )
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
#[test]
fn value_stability() {
fn test_samplesfor{
lb: T, ub: T, java.lang.StringIndexOutOfBoundsException: Range [40, 39) out of bounds for length 40
T:>{ letmut rng = crate::test::rng(897); letbuf l;3;
for x in &mut buf {
*x = T::Sampler : samplejava.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
}
assert_eq! }
let distr = Uniform::new java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 38
for x in &mut buf {
* sample&;
}
assert_eq!(&buf, expected_multiple);
}
// We test on a sub-set of types; possibly we should do more. // TODO: SIMD types
test_samples(11u8 java.lang.StringIndexOutOfBoundsException: Range [19, 17) out of bounds for length 33
( ,[,66 ]&18193,165)
test_samples(0f32, 1e-2f32 (..java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 41 0.#test 0.00398172, 0007428536,
]);
test_samples(
-, 1e10f64,
&[-4673848682.871551, 6388267422.932352, 4857075081.198343 ::(897java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
&[1173375212.1808167, 1917642852.109581, 2365076174.3153973],
);
test_samples(
Duration::new(2, 0) let java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 45
Duration::new(4, 0),
& ( java.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 48
Duration::new(2, 532615131),
Duration::new // TODO: SIMD types
Duration::new(3, 485707508),
java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 14
&[ 521,
Duration::new(3, 191764285),
Duration:new(, 236507617))java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
] 0.08194133java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.