全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3469
推到 Plurk!
推到 Facebook!

如何自己寫一個Random

尚未結案
foxrabbit
一般會員


發表:11
回覆:16
積分:5
註冊:2003-11-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-10 13:05:20 IP:140.115.xxx.xxx 未訂閱
請問各位大大: 小弟想用Java寫一個產生亂數的程式,但不想用random() or java所提供的函式,來做,不知有什麼方法可以做得到呢? 可否請會寫的大大教一下,感激不盡。 ps:小弟已找過站內的文章,但一直沒有頭緒。
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-11 10:16:34 IP:61.64.xxx.xxx 未訂閱
先了解怎麼產生亂數,再寫程式也不急啊 那就是: 先找一個亂數表, 再循序去索引出來.必要時,加上一上範圍運算(如 mod 100). 參考: http://bbs3.nsysu.edu.tw/txtVersion/treasure/cse-algo/M.1039276858.A.html
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-11 14:00:53 IP:210.69.xxx.xxx 未訂閱
一般是抓時間, 然後隨便自己想一套演算法產生亂數, 例如 秒*分 / 3600 (秒/60) ^ 3 ********************* 如果您滿意答案,請結案 *********************
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
foxrabbit
一般會員


發表:11
回覆:16
積分:5
註冊:2003-11-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-15 20:36:31 IP:59.104.xxx.xxx 未訂閱
小弟有找到最常用的公式,但仍不知此公式應如何運用,可否請大大為小弟解說一下,謝謝。 Xn 1 = (aXn c) mod m, n>=0 式中初值 X0, 乘數 a, 增數 c 均不為負, 而且都小於模數 m。 適當選擇 X0, a, c, 和 m 值, 即可產生亂數。 以 32 bits 的計算機為例, 可取 a=3612, c=5701, m=566927。 產生亂數的方法有好幾種,這種方法稱為線性同餘法 (linear congruential method)。
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-17 14:04:54 IP:210.69.xxx.xxx 未訂閱
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;    type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;
  a, c, m, Xn: Integer;    implementation    {$R *.dfm}    procedure TForm1.FormCreate(Sender: TObject);
var
  Hour, Min, Sec, MSec: Word;
begin
  a:=3612;
  c:=5701;
  m:=566927;
  DecodeTime(Now, Hour, Min, Sec, MSec);
  Xn:= Min * 60   Sec;
end;    function  MyRand:Integer;
begin
//Xn 1 = (aXn   c) mod m, n>=0 式中初值 X0, 乘數 a, 增數 c 均不為負, 而且都小於模數 m。
//適當選擇 X0, a, c, 和 m 值, 即可產生亂數。 以 32 bits 的計算機為例, 可取 a=3612, c=5701, m=566927。
//產生亂數的方法有好幾種,這種方法稱為線性同餘法 (linear congruential method)。
  Xn := (a* Xn   c) mod m;
  MyRand := Xn;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := IntToStr(MyRand);
end;    end.    
********************* 如果您滿意答案,請結案 *********************
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
foxrabbit
一般會員


發表:11
回覆:16
積分:5
註冊:2003-11-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-18 15:30:16 IP:203.67.xxx.xxx 未訂閱
這是我最後寫出來的方法,請大大多指導,告訴小弟還有什麼地方可以改進的
import java.util.*;
public class myRandom{
    public static void chkRand(int[] myRand){
        int[] chkR = new int[10];
        for (int j=0 ; j< myRand.length ;j  )
        {
          int jc = myRand[j]/10001;
          chkR[jc]  ;
        }
        int count=0, total=10000;
        for (int k=0; k< chkR.length; k  )
        {
            System.out.println(count " ~ " total " :" chkR[k] " 次");
            count = total 1;
            total  =10000;
        }
        System.out.println("平均出現的次數約為一萬次左右");
    }
    public static void main(String[] args){
        int[] myRand = new int[100001];
        int i = 0;
        while (i <= 100000){
           long seed = System.nanoTime();
           seed = (seed*16807)0001;
           myRand[i] = (int)seed;
           i  ;
        }
        chkRand(myRand);
    }
}
系統時間:2024-04-29 2:35:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!