很有意义的问题,进来看看!!

时间:2022-10-07 11:18:14
package com;

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个数的总概率是二分之一。

#3


可以在 ARRAY_NUM 做手脚,里面多加几个3.
{1, 2, 56 , 109, 11, 6, 3, 10,3,3,3}; 

#4


你这个14是怎么算出来的。我只是一个例子,如果要改变呢?如果要109出现的次数多怎么改?就是要求设置的频率为动态的,最好附有代码,谢谢。。。

#5


rnd.nextInt(ARRAY_NUM.length); 是随机的,你是无法改的
那你当出现非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


引用 6 楼 AeolusLau 的回复:
我也只是举个例子,14=(8-1)*2……
Java codepublicclassTest 
{privatestaticint[] ARRAY_NUM={1,2,56,109,11,6,3,10};publicstaticvoidmain(String[] args)
    {for(inti=0; i<100; i++)
        {try{
                System.out.println(GET_RANDOM_NUM());
                Thread.sleep(10);
            }catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }


手动random很厉害

#10


如果想某个点的值机会大一点,可以用循环检查的方式来逼迫某一次的值一定取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].

#14


可以这样写啊:
Random rnd = new Random(); 
int index = rnd.nextInt(ARRAY_NUM.length+8); 
if(index>ARRAY_NUM.length)
index=3;

#15


引用楼主 cuiyunshow 的帖子:
package com; 

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("i…


答:参考代码:

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个数的总概率是二分之一。

#3


可以在 ARRAY_NUM 做手脚,里面多加几个3.
{1, 2, 56 , 109, 11, 6, 3, 10,3,3,3}; 

#4


你这个14是怎么算出来的。我只是一个例子,如果要改变呢?如果要109出现的次数多怎么改?就是要求设置的频率为动态的,最好附有代码,谢谢。。。

#5


rnd.nextInt(ARRAY_NUM.length); 是随机的,你是无法改的
那你当出现非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


引用 6 楼 AeolusLau 的回复:
我也只是举个例子,14=(8-1)*2……
Java codepublicclassTest 
{privatestaticint[] ARRAY_NUM={1,2,56,109,11,6,3,10};publicstaticvoidmain(String[] args)
    {for(inti=0; i<100; i++)
        {try{
                System.out.println(GET_RANDOM_NUM());
                Thread.sleep(10);
            }catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }


手动random很厉害

#10


如果想某个点的值机会大一点,可以用循环检查的方式来逼迫某一次的值一定取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].

#14


可以这样写啊:
Random rnd = new Random(); 
int index = rnd.nextInt(ARRAY_NUM.length+8); 
if(index>ARRAY_NUM.length)
index=3;

#15


引用楼主 cuiyunshow 的帖子:
package com; 

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("i…


答:参考代码:

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)+" ");
}
}

}