本帖最后由 cat73 于 2014-7-23 23:17 编辑
刚刚学到多线程,就有了个思路,因为线程的切换是随机的,那么可不可以用这种方法来获取随机字符串呢?
于是就开始写了,最后也成功的写出来了,由于初学,代码或许略有些乱,见谅.
本代码可以用于获得一个随机的字符串
优点:几乎不可能被预测
缺点:效率较低,随机性较差,经常出现一些连续的字符
PS.如果你复制后空格都没了,建议复制到eclipse里使用自动整理功能整理一下再看
同时希望能得到各位的宝贵意见~~
- package tk.cat73.hm.h127.Thread;
- /**
- * 利用多线程的原理获取一段随机字符串
- * 优点:几乎不可能被预测
- * 缺点:效率较低,随机性较差,经常出现一些连续的字符
- * @author Cat73
- */
- class RandString {
- private String rand;
- private void addrand(char r) {
- synchronized (this) {
- rand += r;
- }
- }
- class Tmp extends Thread {
- char r;
- int len;
- Tmp(char r, int len) {
- this.r = r;
- this.len = len;
- }
- public void run() {
- for (int i = 0; i < len; i++)
- addrand(r);
- }
- }
- /**
- * 获取一段随机字符串
- * @param len 要获得的字符串长度
- * @param keys 要在返回的字符串中出现的字符
- * @return 返回随机的字符串结果
- */
- public String getRand(int len, char[] keys) {
- rand = "";
- int lenForTmp = (int) (len * 1.5 / keys.length + 20);
- Tmp[] t = new Tmp[keys.length];
- for (int i = 0; i < keys.length; i++)
- t[i] = new Tmp(keys[i], lenForTmp);
- for (int i = 0; i < keys.length; i++)
- t[i].start();
- try {
- for (int i = 0; i < keys.length; i++)
- t[i].join();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(rand.length());
- return rand.substring(rand.length() / 3, rand.length() / 3 + len);
- }
- }
- public class Thread_128 {
- public static void run() {
- RandString r = new RandString();
- char[] str = { '0', '1', '2', '3' };
- String rand = r.getRand(500, str);
- System.out.println(rand);
- System.out.println(rand.length());
- }
- }
复制代码
|
|