使用数字数组来调整特定 return 值的机会?
Using a number array to adjust the chances of a specific return value?
我正在创建一个名为 getRandomLetter()
的方法,我想随机 return 英文字母表中的一个字母。我希望该方法更有可能 return 一个与之关联的数字更大的字母。
我有两个数组。字母表中的每个字母都有字符。第二个有双打,每个代表机会,在另一个数组中具有相同索引的字母将是我的方法 returned 的字母。
我试图让方法根据数组中的值有不同的机会 return 不同的字母。
不幸的是,我的方法只有 returns z 和 y。
如何根据我为每个指定的数字制作 getRandomLetter()
return 具体 letters/chars?
我的代码示例:
public class MCVE {
// each letter's frequency is represented in the next array by
// the double value at the same index as the letter
final private static char[] CharArr = "abcdefghijklmnopqrstuvwxyz".toCharArray();
// Holds each letter's percentage-chance to be chosen
// For Example: 0.1 is equal to 10%
// All-together, they add up to 1.0
final private static double[] DoubleArr = new double[] {
0.087248322147651, 0.035722017752760335, 0.08010391859709894,
0.05520675470881143, 0.046763368694522627, 0.018618748646893266,
0.028144620047629357, 0.021866204806235117, 0.016020783719419788,
0.07101104135094176, 0.06040268456375839, 0.08703182507036156,
0.10002164970772895, 0.027711625893050443, 0.009742368478025547,
0.021433210651656202, 0.0012989824637367395, 0.0458973803853648,
0.07988742151980949, 0.05260878978133795, 0.0015154795410261962,
0.022515696038103484, 0.009309374323446633, 0.0012989824637367395,
0.011690842173630657, 0.006927906473262611};
private static char getRandomLetter() {
double randomDouble = ThreadLocalRandom.current().nextDouble(0.0, 1.0);
char retVal = ' ';
// subtract each value in DoubleArr from randomDouble until,
// randomDouble would be < 0, then return the char that is
// associated with that double
for(int i = 0; i < CharArr.length; i++) {
double subtract = DoubleArr[i];
if (randomDouble - subtract <= 0.0)
retVal = CharArr[i];
else
randomDouble -= subtract;
}
return retVal;
}
public static void main(String[] args) {
// get a large sample of chars to test thoroughness
char[] sampleChars = new char[1000];
for(int i = 0; i < 1000; i++) {
sampleChars[i] = getRandomLetter();
}
// print 10 characters per line
int ct = 0;
for(char c: sampleChars) {
System.out.print(c + " ");
ct++;
if(ct == 10) {
ct = 0;
System.out.println();
}
}
}
}
returned 示例:
z z z z z z z z z z
z z y z z y z z z z
z z y z z z z z z z
z y z z z z z z z z
z z z z z z z z z z
z z z z z z z z y y
z z z z z z z z z z
z y z z z z z z z z
z z z z y z y z z z
当您得到正确答案时,您似乎没有从 for 循环 中 "jump out"。
也许你的 getRandomLetter 应该改为:
for(int i = 0; i < CharArr.length; i++) {
double subtract = DoubleArr[i];
if (randomDouble - subtract <= 0.0) {
retVal = CharArr[i];
break;
}
else
randomDouble -= subtract;
}
您似乎不需要 CharArray
,而是一个简单的循环,其中包含一个 int
计数器和一个 while
循环,用于根据您的概率测试该计数器和累加器。喜欢,
private static char getRandomLetter() {
double randomDouble = ThreadLocalRandom.current().nextDouble(), v = 0;
int p = 0;
while (p < DoubleArr.length && v <= randomDouble) {
v += DoubleArr[p++];
}
return (char) ('a' + Math.min(p, 26) - 1);
}
无需任何其他更改,您的代码就可以正常工作。 注意 nextDouble()
的默认行为是您指定的范围。
我正在创建一个名为 getRandomLetter()
的方法,我想随机 return 英文字母表中的一个字母。我希望该方法更有可能 return 一个与之关联的数字更大的字母。
我有两个数组。字母表中的每个字母都有字符。第二个有双打,每个代表机会,在另一个数组中具有相同索引的字母将是我的方法 returned 的字母。
我试图让方法根据数组中的值有不同的机会 return 不同的字母。
不幸的是,我的方法只有 returns z 和 y。
如何根据我为每个指定的数字制作 getRandomLetter()
return 具体 letters/chars?
我的代码示例:
public class MCVE {
// each letter's frequency is represented in the next array by
// the double value at the same index as the letter
final private static char[] CharArr = "abcdefghijklmnopqrstuvwxyz".toCharArray();
// Holds each letter's percentage-chance to be chosen
// For Example: 0.1 is equal to 10%
// All-together, they add up to 1.0
final private static double[] DoubleArr = new double[] {
0.087248322147651, 0.035722017752760335, 0.08010391859709894,
0.05520675470881143, 0.046763368694522627, 0.018618748646893266,
0.028144620047629357, 0.021866204806235117, 0.016020783719419788,
0.07101104135094176, 0.06040268456375839, 0.08703182507036156,
0.10002164970772895, 0.027711625893050443, 0.009742368478025547,
0.021433210651656202, 0.0012989824637367395, 0.0458973803853648,
0.07988742151980949, 0.05260878978133795, 0.0015154795410261962,
0.022515696038103484, 0.009309374323446633, 0.0012989824637367395,
0.011690842173630657, 0.006927906473262611};
private static char getRandomLetter() {
double randomDouble = ThreadLocalRandom.current().nextDouble(0.0, 1.0);
char retVal = ' ';
// subtract each value in DoubleArr from randomDouble until,
// randomDouble would be < 0, then return the char that is
// associated with that double
for(int i = 0; i < CharArr.length; i++) {
double subtract = DoubleArr[i];
if (randomDouble - subtract <= 0.0)
retVal = CharArr[i];
else
randomDouble -= subtract;
}
return retVal;
}
public static void main(String[] args) {
// get a large sample of chars to test thoroughness
char[] sampleChars = new char[1000];
for(int i = 0; i < 1000; i++) {
sampleChars[i] = getRandomLetter();
}
// print 10 characters per line
int ct = 0;
for(char c: sampleChars) {
System.out.print(c + " ");
ct++;
if(ct == 10) {
ct = 0;
System.out.println();
}
}
}
}
returned 示例:
z z z z z z z z z z
z z y z z y z z z z
z z y z z z z z z z
z y z z z z z z z z
z z z z z z z z z z
z z z z z z z z y y
z z z z z z z z z z
z y z z z z z z z z
z z z z y z y z z z
当您得到正确答案时,您似乎没有从 for 循环 中 "jump out"。 也许你的 getRandomLetter 应该改为:
for(int i = 0; i < CharArr.length; i++) {
double subtract = DoubleArr[i];
if (randomDouble - subtract <= 0.0) {
retVal = CharArr[i];
break;
}
else
randomDouble -= subtract;
}
您似乎不需要 CharArray
,而是一个简单的循环,其中包含一个 int
计数器和一个 while
循环,用于根据您的概率测试该计数器和累加器。喜欢,
private static char getRandomLetter() {
double randomDouble = ThreadLocalRandom.current().nextDouble(), v = 0;
int p = 0;
while (p < DoubleArr.length && v <= randomDouble) {
v += DoubleArr[p++];
}
return (char) ('a' + Math.min(p, 26) - 1);
}
无需任何其他更改,您的代码就可以正常工作。 注意 nextDouble()
的默认行为是您指定的范围。