You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by br...@apache.org on 2014/01/11 20:10:13 UTC
svn commit: r1557434 - in /commons/proper/lang/trunk/src:
changes/changes.xml main/java/org/apache/commons/lang3/RandomUtils.java
test/java/org/apache/commons/lang3/RandomUtilsTest.java
Author: britter
Date: Sat Jan 11 19:10:13 2014
New Revision: 1557434
URL: http://svn.apache.org/r1557434
Log:
LANG-900: New RandumUtils class. Thanks to Duncan Jones
Added:
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/RandomUtils.java (with props)
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java (with props)
Modified:
commons/proper/lang/trunk/src/changes/changes.xml
Modified: commons/proper/lang/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1557434&r1=1557433&r2=1557434&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original)
+++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Sat Jan 11 19:10:13 2014
@@ -22,6 +22,7 @@
<body>
<release version="3.2.2" date="TBA" description="Bug fix for 3.2.1">
+ <action issue="LANG-900" type="add" dev="britter" due-to="Duncan Jones">New RandomUtils class</action>
<action issue="LANG-915" type="fix" dev="britter" due-to="Sergio Fernández">Wrong locale handling in LocaleUtils.toLocale()</action>
</release>
Added: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/RandomUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/RandomUtils.java?rev=1557434&view=auto
==============================================================================
--- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/RandomUtils.java (added)
+++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/RandomUtils.java Sat Jan 11 19:10:13 2014
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3;
+
+import java.util.Random;
+
+/**
+ * Utility library that supplements the standard {@link Random} class.
+ *
+ * @since 3.3
+ *
+ * @version $Id$
+ */
+public class RandomUtils {
+
+ /**
+ * Random object used by random method. This has to be not local to the
+ * random method so as to not return the same value in the same millisecond.
+ */
+ private static final Random RANDOM = new Random();
+
+ /**
+ * <p>
+ * {@code RandomUtils} instances should NOT be constructed in standard
+ * programming. Instead, the class should be used as
+ * {@code RandomUtils.nextBytes(5);}.
+ * </p>
+ *
+ * <p>
+ * This constructor is public to permit tools that require a JavaBean
+ * instance to operate.
+ * </p>
+ */
+ public RandomUtils() {
+ super();
+ }
+
+ /**
+ * Creates a array of the specified length filled with random bytes.
+ *
+ * @param count
+ * the size of the returned array
+ * @return the random byte array
+ */
+ public static byte[] nextBytes(int count) {
+ Validate.isTrue(count >= 0, "Count cannot be negative.");
+
+ byte[] result = new byte[count];
+ RANDOM.nextBytes(result);
+ return result;
+ }
+
+ /**
+ * Returns a random integer within the specified range.
+ *
+ * @param startInclusive
+ * the smallest value that can be returned, must be non-negative
+ * @param endExclusive
+ * the upper bound (not included), must be non-negative
+ * @throws IllegalArgumentException
+ * if {@code startInclusive > endInclusive}
+ * @return the random integer
+ */
+ public static int nextInt(int startInclusive, int endExclusive) {
+ Validate.isTrue(endExclusive >= startInclusive,
+ "Start value must be smaller or equal to end value.");
+ Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative.");
+
+ if (startInclusive == endExclusive) {
+ return startInclusive;
+ }
+
+ return startInclusive + RANDOM.nextInt(endExclusive - startInclusive);
+ }
+
+ /**
+ * Returns a random long within the specified range.
+ *
+ * @param startInclusive
+ * the smallest value that can be returned, must be non-negative
+ * @param endExclusive
+ * the upper bound (not included), must be non-negative
+ * @throws IllegalArgumentException
+ * if {@code startInclusive > endInclusive}
+ * @return the random long
+ */
+ public static long nextLong(long startInclusive, long endExclusive) {
+ Validate.isTrue(endExclusive >= startInclusive,
+ "Start value must be smaller or equal to end value.");
+ Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative.");
+
+ if (startInclusive == endExclusive) {
+ return startInclusive;
+ }
+
+ return (long) nextDouble(startInclusive, endExclusive);
+ }
+
+
+ /**
+ * Returns a random double within the specified range.
+ *
+ * @param startInclusive
+ * the smallest value that can be returned, must be non-negative
+ * @param endInclusive
+ * the upper bound (included), must be non-negative
+ * @throws IllegalArgumentException
+ * if {@code startInclusive > endInclusive}
+ * @return the random double
+ */
+ public static double nextDouble(double startInclusive, double endInclusive) {
+ Validate.isTrue(endInclusive >= startInclusive,
+ "Start value must be smaller or equal to end value.");
+ Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative.");
+
+ if (startInclusive == endInclusive) {
+ return startInclusive;
+ }
+
+ return startInclusive + ((endInclusive - startInclusive) * RANDOM.nextDouble());
+ }
+
+ /**
+ * Returns a random float within the specified range.
+ *
+ * @param startInclusive
+ * the smallest value that can be returned, must be non-negative
+ * @param endInclusive
+ * the upper bound (included), must be non-negative
+ * @throws IllegalArgumentException
+ * if {@code startInclusive > endInclusive}
+ * @return the random float
+ */
+ public static float nextFloat(float startInclusive, float endInclusive) {
+ Validate.isTrue(endInclusive >= startInclusive,
+ "Start value must be smaller or equal to end value.");
+ Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative.");
+
+ if (startInclusive == endInclusive) {
+ return startInclusive;
+ }
+
+ return startInclusive + ((endInclusive - startInclusive) * RANDOM.nextFloat());
+ }
+}
Propchange: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/RandomUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/RandomUtils.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Added: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java?rev=1557434&view=auto
==============================================================================
--- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java (added)
+++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java Sat Jan 11 19:10:13 2014
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+
+/**
+ * Tests for {@link RandomUtils}
+ *
+ * @version $Id$
+ */
+public class RandomUtilsTest {
+
+ /**
+ * For comparing doubles and floats
+ */
+ private static final double DELTA = 1e-5;
+
+ /**
+ * Tests exceptions
+ */
+ @Test
+ public void testExceptions() throws Exception {
+ try {
+ RandomUtils.nextBytes(-1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ RandomUtils.nextInt(2, 1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ RandomUtils.nextDouble(2, 1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ RandomUtils.nextLong(2, 1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ RandomUtils.nextFloat(2, 1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ RandomUtils.nextInt(-1, 1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ RandomUtils.nextDouble(-1, 1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ RandomUtils.nextLong(-1, 1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ RandomUtils.nextFloat(-1, 1);
+ fail();
+ } catch (IllegalArgumentException e) {}
+ }
+
+ /**
+ * Tests a zero byte array length.
+ */
+ @Test
+ public void testZeroLengthNextBytes() throws Exception {
+ assertArrayEquals(new byte[0], RandomUtils.nextBytes(0));
+ }
+
+ /**
+ * Tests random byte array.
+ */
+ @Test
+ public void testNextBytes() throws Exception {
+ byte[] result = RandomUtils.nextBytes(20);
+ assertEquals(20, result.length);
+ }
+
+ /**
+ * Test next int range with minimal range.
+ */
+ @Test
+ public void testNextIntMinimalRange() throws Exception {
+ assertEquals(42, RandomUtils.nextInt(42, 42));
+ }
+
+ /**
+ * Tests next int range.
+ */
+ @Test
+ public void testNextInt() throws Exception {
+ int result = RandomUtils.nextInt(33, 42);
+ assertTrue(result >= 33 && result < 42);
+ }
+
+ /**
+ * Test next double range with minimal range.
+ */
+ @Test
+ public void testNextDoubleMinimalRange() throws Exception {
+ assertEquals(42.1, RandomUtils.nextDouble(42.1, 42.1), DELTA);
+ }
+
+ /**
+ * Test next float range with minimal range.
+ */
+ @Test
+ public void testNextFloatMinimalRange() throws Exception {
+ assertEquals(42.1f, RandomUtils.nextFloat(42.1f, 42.1f), DELTA);
+ }
+
+ /**
+ * Tests next double range.
+ */
+ @Test
+ public void testNextDouble() throws Exception {
+ double result = RandomUtils.nextDouble(33d, 42d);
+ assertTrue(result >= 33d && result <= 42d);
+ }
+
+ /**
+ * Tests next float range.
+ */
+ @Test
+ public void testNextFloat() throws Exception {
+ double result = RandomUtils.nextFloat(33f, 42f);
+ assertTrue(result >= 33f && result <= 42f);
+ }
+
+ /**
+ * Test next long range with minimal range.
+ */
+ @Test
+ public void testNextLongMinimalRange() throws Exception {
+ assertEquals(42L, RandomUtils.nextLong(42L, 42L));
+ }
+
+ /**
+ * Tests next long range.
+ */
+ @Test
+ public void testNextLong() throws Exception {
+ long result = RandomUtils.nextLong(33L, 42L);
+ assertTrue(result >= 33L && result < 42L);
+ }
+
+
+ /**
+ * Tests extreme range.
+ */
+ @Test
+ public void testExtremeRangeInt() throws Exception {
+ int result = RandomUtils.nextInt(0, Integer.MAX_VALUE);
+ assertTrue(result >= 0 && result < Integer.MAX_VALUE);
+ }
+
+ /**
+ * Tests extreme range.
+ */
+ @Test
+ public void testExtremeRangeLong() throws Exception {
+ long result = RandomUtils.nextLong(0, Long.MAX_VALUE);
+ assertTrue(result >= 0 && result < Long.MAX_VALUE);
+ }
+
+ /**
+ * Tests extreme range.
+ */
+ @Test
+ public void testExtremeRangeFloat() throws Exception {
+ float result = RandomUtils.nextFloat(0, Float.MAX_VALUE);
+ assertTrue(result >= 0f && result <= Float.MAX_VALUE);
+ }
+
+ /**
+ * Tests extreme range.
+ */
+ @Test
+ public void testExtremeRangeDouble() throws Exception {
+ double result = RandomUtils.nextDouble(0, Double.MAX_VALUE);
+ assertTrue(result >= 0 && result <= Double.MAX_VALUE);
+ }
+}
Propchange: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RandomUtilsTest.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL