2013-04-01 2 views
2

Как создать случайное число, ограниченное между двумя номерами на Java-карте? Например, номер должен быть сгенерирован между 0 и 50.Генерировать случайное число, ограниченное между двумя номерами в Java-карте

+0

[Что вы пробовали?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – Walls

+0

использования RandomData абстрактного класса –

ответ

-1

Здесь examples. На примере 2 из этой ссылки:

import java.util.Random; 

/** Generate random integers in a certain range. */ 
public final class RandomRange { 

public static final void main(String... aArgs){ 
    log("Generating random integers in the range 1..10."); 

    int START = 1; 
    int END = 10; 
    Random random = new Random(); 
    for (int idx = 1; idx <= 10; ++idx){ 
    showRandomInteger(START, END, random); 
    } 

    log("Done."); 
} 

private static void showRandomInteger(int aStart, int aEnd, Random aRandom){ 
    if (aStart > aEnd) { 
    throw new IllegalArgumentException("Start cannot exceed End."); 
} 
//get the range, casting to long to avoid overflow problems 
long range = (long)aEnd - (long)aStart + 1; 
// compute a fraction of the range, 0 <= frac < range 
long fraction = (long)(range * aRandom.nextDouble()); 
int randomNumber = (int)(fraction + aStart);  
log("Generated : " + randomNumber); 
} 

private static void log(String aMessage){ 
System.out.println(aMessage); 
} 
} 
+1

это в Java, я хочу тот же результат в javaCard –

-1

использования RandomData абстрактного класса:

http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/security/RandomData.html

Edit:

здесь является exaple этого класса в использовании,

byte[] keyBytes = JCSystem.getTransientByteArray(COD,16); 

RandomData rng = RandomData.getInstance(ALG_SECURE_RANDOM); 
rng.generateData(keyBytes,0,16); 

Если вы просто ищете случайное число вместо randomData вы можете использовать это:

/* 
    * generate a random number between 0 and 50 
    */ 
    Random random1 = new Random(); 
    int card = (random1.nextInt(51)); 
+0

Я видел эту ссылку, но я не знал, как использовать эту функцию, не могли бы вы дать мне пример, пожалуйста, –

+0

Я отредактировал свой ответ на примере используемого класса RandomData –

+1

спасибо вам за ваши реплики, Я хочу тот же результат второго примера: int card = (random1.nextInt (51)); но в javaCard, потому что этот случайный недоступен в API-интерфейсе Java 2.2.2. –

1

В Java Card, у вас есть доступ только к javacard.security.RandomData, который только способен генерировать случайные байты.

Сначала необходим переменный нужного типа:

private RandomData rng; 
private byte[] rndBuffer; 

Тогда вам нужен следующий код в конструкторе/установок (чтобы избежать размещения генератора случайных чисел и буфер каждый раз):

rng = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM); 
rndBuffer = JCSystem.getTransientByteArray(JCSystem.CLEAR_ON_DESELECT, 1); 

И потом, вы можете определить свой метод, чтобы получить случайные байты в диапазоне:

byte getRandomByteInRange(byte min, byte max) { 
    do { 
    rng.generateData(rndBuffer,0,1); 
    while ((rndBuffer[0]<min) || (rndBuffer[0]>max)) 
    return rndBuffer[0]; 
} 

Существует, скорее всего, менее глупый способ написать этот метод (особенно для небольших диапазонов), но он должен работать.

+1

Да, есть, проверьте [этот (несколько математический) ответ на крипто] (http://crypto.stackexchange.com/questions/7996/correct-way-to-map-random-number-to-defined-range) , обычный ответ для Java - использовать (или в этом случае копию) метод Random.nextInt() в Java SE. –

+0

Проверьте свой код. 'getTransientByteArray' не существует, порядок параметров неверен, а тестирование против значения напрямую крайне наивно. Кроме того, я не думаю, что минимальное значение и максимальное значение должны быть как исключительными.Обычно это от min (включительно) до max (exclusive). Что-то можно сказать об инклюзивном включении, но я не думаю, что кто-то мог ожидать диапазон от 0 до 2, чтобы иметь возможность доставить значение 1. Как раз для каждого 256 в среднем тоже. –

+0

Вы направлялись в правильном направлении, хотя :) –

4

Будучи заинтригованным этим вопросом, я снова решил внести некоторые вклады в код через StackOverflow. Обратите внимание, что я проверил только распределение случайных чисел, используя SecureRandom в Java SE. Я уверен, что этот код правильный.

Итак, без дальнейших церемоний, код.

package nl.owlstead.jcsecurerandom; 

import javacard.framework.JCSystem; 
import javacard.framework.Util; 
import javacard.security.RandomData; 

/** 
* Generates numbers within a range. This class uses modulo arithmetic to 
* minimize the number of calls to the random number generator without expensive 
* calculations. The class is similar in operation to the 
* {@code SecureRandom.nextInt(int)} method defined in Java SE. 
* 
* @author owlstead 
*/ 
public final class JCSecureRandom { 

    private static final short SHORT_SIZE_BYTES = 2; 
    private static final short START = 0; 

    private final RandomData rnd; 
    private final byte[] buf; 

    /** 
    * Constructor which uses the given source of random bytes. A two byte 
    * buffer transient buffer is generated that is cleared on deselect. 
    * 
    * @param rnd 
    *   the source of random bytes 
    */ 
    public JCSecureRandom(final RandomData rnd) { 
     this.rnd = rnd; 
     this.buf = JCSystem.makeTransientByteArray(SHORT_SIZE_BYTES, 
       JCSystem.CLEAR_ON_DESELECT); 
    } 

    /** 
    * Generates a single short with a random value in the range of 0 
    * (inclusive) to the given parameter n (exclusive). 
    * 
    * @param n 
    *   the upper bound of the random value, must be positive 
    *   (exclusive) 
    * @return the random value in the range [0..n-1] 
    */ 
    public short nextShort(final short n) { 
     final short sn = (short) (n - 1); 
     short bits, val; 
     do { 
      bits = next15(); 
      val = (short) (bits % n); 
     } while ((short) (bits - val + sn) < 0); 
     return val; 
    } 

    /** 
    * Generates a single byte with a random value in the range of 0 (inclusive) 
    * to the given parameter n (exclusive). 
    * 
    * @param n 
    *   the upper bound of the random value, must be positive 
    *   (exclusive) 
    * @return the random value in the range [0..n-1] 
    */ 
    public byte nextByte(final byte n) { 
     if ((n & -n) == n) { 
      return (byte) ((n * next7()) >> 7); 
     } 

     final byte sn = (byte) (n - 1); 
     byte bits, val; 
     do { 
      bits = next7(); 
      val = (byte) (bits % n); 
     } while ((byte) (bits - val + sn) < 0); 
     return val; 
    } 

    /** 
    * Generates 15 bits from two bytes by setting the highest bit to zero. 
    * 
    * @return the positive valued short containing 15 bits of random 
    */ 
    private short next15() { 
     this.rnd.generateData(this.buf, START, SHORT_SIZE_BYTES); 
     return (short) (Util.getShort(this.buf, START) & 0x7FFF); 
    } 

    /** 
    * Generates 7 bits from one byte by setting the highest bit to zero. 
    * 
    * @return the positive valued byte containing 7 bits of random 
    */ 
    private byte next7() { 
     this.rnd.generateData(this.buf, START, SHORT_SIZE_BYTES); 
     return (byte) (this.buf[START] & 0x7F); 
    } 
} 
+0

Просьба указать, отвечает ли этот вопрос на ваш вопрос или требуется дополнительная информация. –

Смежные вопросы