import java.util.Random;
public class Test {
private static int[] ARRAY_NUM = {1, 2, 56 , 109, 11, 6, 3, 10};
public static void main(String[] args) {
for (int i = 0; i < 30; i ++)
System.out.println(GET_RANDOM_NUM());
}
public static int GET_RANDOM_NUM() {
Random rnd = new Random();
int index = rnd.nextInt(ARRAY_NUM.length);
System.out.println("index=" + index);
return ARRAY_NUM[index];
}
}
我想控制产生的随机数的频率,就是哪个一些数出现的次数多,哪些出现的次数相对少,
比如我想3出现的次数多,怎么写,请高手指教
15 个解决方案
#1
你这里是随机抽取下标,
int index = rnd.nextInt(ARRAY_NUM.length);;不知道要怎么控制index=6的次数。。等高人来帮你解决~~
#2
对随机数生成的一个通常的考虑是取系统时间。
lz给了8个整数,可以使用取到的系统时间的毫秒值整除8,以得到的余数作为数组的下标。这样取到8个数的概率理论上来讲是相同的。
如果想获得3的概率比较高,可以将系统时间毫秒值整除14,当余数为7-13的时候返回3,这样有二分之一的概率取到3,而取到其他7个数的总概率是二分之一。
lz给了8个整数,可以使用取到的系统时间的毫秒值整除8,以得到的余数作为数组的下标。这样取到8个数的概率理论上来讲是相同的。
如果想获得3的概率比较高,可以将系统时间毫秒值整除14,当余数为7-13的时候返回3,这样有二分之一的概率取到3,而取到其他7个数的总概率是二分之一。
#3
可以在 ARRAY_NUM 做手脚,里面多加几个3.
{1, 2, 56 , 109, 11, 6, 3, 10,3,3,3};
{1, 2, 56 , 109, 11, 6, 3, 10,3,3,3};
#4
你这个14是怎么算出来的。我只是一个例子,如果要改变呢?如果要109出现的次数多怎么改?就是要求设置的频率为动态的,最好附有代码,谢谢。。。
#5
rnd.nextInt(ARRAY_NUM.length); 是随机的,你是无法改的
那你当出现非3的数时也返回3得了,这个返回策略自己掌握,如当奇数时原样返回,偶数时返回3
那你当出现非3的数时也返回3得了,这个返回策略自己掌握,如当奇数时原样返回,偶数时返回3
#6
我也只是举个例子,14=(8-1)*2……
public class Test
{
private static int[] ARRAY_NUM = {1, 2, 56 , 109, 11, 6, 3, 10};
public static void main(String[] args)
{
for (int i=0; i<100; i++)
{
try
{
System.out.println(GET_RANDOM_NUM());
Thread.sleep(10);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public static int GET_RANDOM_NUM()
{
int[] probability = {1, 1, 1, 1, 1, 7, 1, 1}; // 每个数出现的概率,可以通过程序控制。
int[] probabilitySum = new int[8]; // 第i个数之前的所有数出现的概率的总和。
for (int i=0; i<probabilitySum.length; i++) // 计算第i个数之前的所有数出现的概率的总和
{
int sum = 0;
for (int j=0; j<i; j++)
{
sum += probability[j];
}
probabilitySum[i] = sum;
}
int a = (int)(System.currentTimeMillis() % 14); // 概率点,改点落在那个区间就取哪个区间的值
int random = -1;
for (int i=0; i<probabilitySum.length; i++)
{
if (a <= probabilitySum[i]) // 概率点落在第i个区间
{
random = ARRAY_NUM[i];
break;
}
}
return random;
}
}
#7
网页上的排版好乱啊,跟eclipse里完全不一样~~
#8
mark
#9
手动random很厉害
#10
如果想某个点的值机会大一点,可以用循环检查的方式来逼迫某一次的值一定取3的时候再输出,呵呵,可能是比较笨的方法了。
如果想要至少3次取值有3的话,可以改成
这样第1,11,21次的输出就都是3了
如果想要至少3次取值有3的话,可以改成
package com;
import java.util.Random;
public class random {
private static int[] ARRAY_NUM = {1, 2, 56 , 109, 11, 6, 3, 10};
public static void main(String[] args) {
for (int i = 0; i < 30; i ++){
GET_RANDOM_NUM(i);
}
}
public static int GET_RANDOM_NUM(int x) {
Random rnd = new Random();
int index = rnd.nextInt(ARRAY_NUM.length);
if(x%10==0){
if(index != 6){
GET_RANDOM_NUM(x);
}
else
{
System.out.println((x+1)+" times , index=" + index + " "+ARRAY_NUM[index]);
}
}
else
{
System.out.println((x+1)+" times , index=" + index + " "+ARRAY_NUM[index]);
}
return 0;
}
}
这样第1,11,21次的输出就都是3了
#11
利用数学中的区间来设定应该可以的
#12
那个用时间算随机数的方法好像很经典
#13
有一个比较简单的方法吧:
1. 取任意一个随机正整数rand
2. 对于ARRAY_NUM ={1, 2, 56 , 109, 11, 6, 3, 10},若你想各数随机出现的频率不一样,比如对1,2,56,109,出现的频率较高,各为15%(3/20);对11, 6, 3, 10,出现的频率较低,各为10%(2/20)。
则取余:r = rand % 20.
3. switch(r){
case 1: case 2: case 3: return ARRAY_NUM[0]; break;
case 4: case 5: case 6: return ARRAY_NUM[1]; break;
.....
case 19: case 20: return ARRAY_NUM[7]; break;
default;
}
就是把余数分成不同的范围,再取得ARRAY_NUM[index].
1. 取任意一个随机正整数rand
2. 对于ARRAY_NUM ={1, 2, 56 , 109, 11, 6, 3, 10},若你想各数随机出现的频率不一样,比如对1,2,56,109,出现的频率较高,各为15%(3/20);对11, 6, 3, 10,出现的频率较低,各为10%(2/20)。
则取余:r = rand % 20.
3. switch(r){
case 1: case 2: case 3: return ARRAY_NUM[0]; break;
case 4: case 5: case 6: return ARRAY_NUM[1]; break;
.....
case 19: case 20: return ARRAY_NUM[7]; break;
default;
}
就是把余数分成不同的范围,再取得ARRAY_NUM[index].
#14
可以这样写啊:
Random rnd = new Random();
int index = rnd.nextInt(ARRAY_NUM.length+8);
if(index>ARRAY_NUM.length)
index=3;
#15
答:参考代码:
public class Testfreq {
/*
* 功能:设int[] a={3,120,5,6};
* double[] f={0.3,0.5,0.15,0.15};注:概率之和必须是1
* 表示a中:3出现的概率是0.3,120出现的概率是0.5,...
* 按指定的概率返回a中的数值
* */
public static int getNum(int[] a,double[] f)
{
double d=Math.random();//产生一个随机数
double s=0;
for(int i=0;i<a.length;i++)
{
s = s+f[i];
if(d<s) return a[i];
//若概率d处于0到f[0]之间,则返回a[0],若概率d处于f[0]到(f[0]+f[1])之间,则返回a[1],..
}
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={3,120,5,6};
double[] f={0.3,0.5,0.15,0.15};
for(int i=1;i<=20;i++)
{
System.out.print(getNum(a, f)+" ");
}
}
}
#1
你这里是随机抽取下标,
int index = rnd.nextInt(ARRAY_NUM.length);;不知道要怎么控制index=6的次数。。等高人来帮你解决~~
#2
对随机数生成的一个通常的考虑是取系统时间。
lz给了8个整数,可以使用取到的系统时间的毫秒值整除8,以得到的余数作为数组的下标。这样取到8个数的概率理论上来讲是相同的。
如果想获得3的概率比较高,可以将系统时间毫秒值整除14,当余数为7-13的时候返回3,这样有二分之一的概率取到3,而取到其他7个数的总概率是二分之一。
lz给了8个整数,可以使用取到的系统时间的毫秒值整除8,以得到的余数作为数组的下标。这样取到8个数的概率理论上来讲是相同的。
如果想获得3的概率比较高,可以将系统时间毫秒值整除14,当余数为7-13的时候返回3,这样有二分之一的概率取到3,而取到其他7个数的总概率是二分之一。
#3
可以在 ARRAY_NUM 做手脚,里面多加几个3.
{1, 2, 56 , 109, 11, 6, 3, 10,3,3,3};
{1, 2, 56 , 109, 11, 6, 3, 10,3,3,3};
#4
你这个14是怎么算出来的。我只是一个例子,如果要改变呢?如果要109出现的次数多怎么改?就是要求设置的频率为动态的,最好附有代码,谢谢。。。
#5
rnd.nextInt(ARRAY_NUM.length); 是随机的,你是无法改的
那你当出现非3的数时也返回3得了,这个返回策略自己掌握,如当奇数时原样返回,偶数时返回3
那你当出现非3的数时也返回3得了,这个返回策略自己掌握,如当奇数时原样返回,偶数时返回3
#6
我也只是举个例子,14=(8-1)*2……
public class Test
{
private static int[] ARRAY_NUM = {1, 2, 56 , 109, 11, 6, 3, 10};
public static void main(String[] args)
{
for (int i=0; i<100; i++)
{
try
{
System.out.println(GET_RANDOM_NUM());
Thread.sleep(10);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public static int GET_RANDOM_NUM()
{
int[] probability = {1, 1, 1, 1, 1, 7, 1, 1}; // 每个数出现的概率,可以通过程序控制。
int[] probabilitySum = new int[8]; // 第i个数之前的所有数出现的概率的总和。
for (int i=0; i<probabilitySum.length; i++) // 计算第i个数之前的所有数出现的概率的总和
{
int sum = 0;
for (int j=0; j<i; j++)
{
sum += probability[j];
}
probabilitySum[i] = sum;
}
int a = (int)(System.currentTimeMillis() % 14); // 概率点,改点落在那个区间就取哪个区间的值
int random = -1;
for (int i=0; i<probabilitySum.length; i++)
{
if (a <= probabilitySum[i]) // 概率点落在第i个区间
{
random = ARRAY_NUM[i];
break;
}
}
return random;
}
}
#7
网页上的排版好乱啊,跟eclipse里完全不一样~~
#8
mark
#9
手动random很厉害
#10
如果想某个点的值机会大一点,可以用循环检查的方式来逼迫某一次的值一定取3的时候再输出,呵呵,可能是比较笨的方法了。
如果想要至少3次取值有3的话,可以改成
这样第1,11,21次的输出就都是3了
如果想要至少3次取值有3的话,可以改成
package com;
import java.util.Random;
public class random {
private static int[] ARRAY_NUM = {1, 2, 56 , 109, 11, 6, 3, 10};
public static void main(String[] args) {
for (int i = 0; i < 30; i ++){
GET_RANDOM_NUM(i);
}
}
public static int GET_RANDOM_NUM(int x) {
Random rnd = new Random();
int index = rnd.nextInt(ARRAY_NUM.length);
if(x%10==0){
if(index != 6){
GET_RANDOM_NUM(x);
}
else
{
System.out.println((x+1)+" times , index=" + index + " "+ARRAY_NUM[index]);
}
}
else
{
System.out.println((x+1)+" times , index=" + index + " "+ARRAY_NUM[index]);
}
return 0;
}
}
这样第1,11,21次的输出就都是3了
#11
利用数学中的区间来设定应该可以的
#12
那个用时间算随机数的方法好像很经典
#13
有一个比较简单的方法吧:
1. 取任意一个随机正整数rand
2. 对于ARRAY_NUM ={1, 2, 56 , 109, 11, 6, 3, 10},若你想各数随机出现的频率不一样,比如对1,2,56,109,出现的频率较高,各为15%(3/20);对11, 6, 3, 10,出现的频率较低,各为10%(2/20)。
则取余:r = rand % 20.
3. switch(r){
case 1: case 2: case 3: return ARRAY_NUM[0]; break;
case 4: case 5: case 6: return ARRAY_NUM[1]; break;
.....
case 19: case 20: return ARRAY_NUM[7]; break;
default;
}
就是把余数分成不同的范围,再取得ARRAY_NUM[index].
1. 取任意一个随机正整数rand
2. 对于ARRAY_NUM ={1, 2, 56 , 109, 11, 6, 3, 10},若你想各数随机出现的频率不一样,比如对1,2,56,109,出现的频率较高,各为15%(3/20);对11, 6, 3, 10,出现的频率较低,各为10%(2/20)。
则取余:r = rand % 20.
3. switch(r){
case 1: case 2: case 3: return ARRAY_NUM[0]; break;
case 4: case 5: case 6: return ARRAY_NUM[1]; break;
.....
case 19: case 20: return ARRAY_NUM[7]; break;
default;
}
就是把余数分成不同的范围,再取得ARRAY_NUM[index].
#14
可以这样写啊:
Random rnd = new Random();
int index = rnd.nextInt(ARRAY_NUM.length+8);
if(index>ARRAY_NUM.length)
index=3;
#15
答:参考代码:
public class Testfreq {
/*
* 功能:设int[] a={3,120,5,6};
* double[] f={0.3,0.5,0.15,0.15};注:概率之和必须是1
* 表示a中:3出现的概率是0.3,120出现的概率是0.5,...
* 按指定的概率返回a中的数值
* */
public static int getNum(int[] a,double[] f)
{
double d=Math.random();//产生一个随机数
double s=0;
for(int i=0;i<a.length;i++)
{
s = s+f[i];
if(d<s) return a[i];
//若概率d处于0到f[0]之间,则返回a[0],若概率d处于f[0]到(f[0]+f[1])之间,则返回a[1],..
}
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={3,120,5,6};
double[] f={0.3,0.5,0.15,0.15};
for(int i=1;i<=20;i++)
{
System.out.print(getNum(a, f)+" ");
}
}
}