• 締切済み

パスカル言語を用いた乱数利用について

パスカル言語を用いた乱数発生についての質問です。 パスカル言語を用いて0~100までの整数をランダムで10個出したいので、次のようにプログラムを組んだのですが、 欲しい乱数が出てきません。どこが間違えているか指摘していただけないでしょうか。よろしくお願いします。 var x : integer; p : real; {本当はintegerなのだろうが、使うよう指示されたrandom関数を使うとなるとrealしか受け付けなかった。} begin i := 0; x := seed(wallclock); while i <> 10 do begin i := i + 1; p := random(100); writeln('random(100)=',p) end end. ちなみに、これを出力した時の例はこのような感じです。 random(100)=6.8e-01 random(100)=6.4e-02 random(100)=9.3e-01 random(100)=1.3e-01 random(100)=7.2e-01 random(100)=8.8e-01 random(100)=9.1e-02 random(100)=9.5e-01 random(100)=3.6e-01 random(100)=7.9e-01 (※6.8e-01とは6.8*10^(-1)をのことです)

みんなの回答

noname#129118
noname#129118
回答No.1

乱数発生関数は、0~1のはず。 よって、その値を100倍して0~99にするんでないかい?

hige1049jp
質問者

お礼

ご回答ありがとうございます! 乱数発生関数は0~1とはしりませんでした(; ・`д・´) ご説明くださり本当にありがとうございます!

関連するQ&A

  • pascalにおける乱数の組み込み方

    学校の課題で「1≦x≦n、1≦y≦nの範囲の点(x,y)をランダム個数選び、(0,0)から見える点の個数を数えよ」という課題が出ました。 nは自由に設定し、入力する毎に選択する個数をランダムで決めxとyもその個数分選び、それらの中でGCD(x、y)=1となる点の個数を数える問題です。 参考としてランダムを表すプログラム program seed_example(output); var i,x:integer; begin x := seed(wallclock); writeln('乱数の作成:'); for i := 1 to 10 do begin writeln(random(0)); end; end. が与えられました。(上式のxは問題のxと無関係) 今回の問題では、選ぶ個数を「h」とすると 『h := seed(wallclock);(以下略)』と設定しランダム化させxとyは 『for x(or y) := 1 to h do(以下略)』としてh個選ぶ。 このような考え方で合っているのでしょうか? 回答お待ちしております。

  • Pascal言語で小町算

    Pascal言語で、『1~9の順に数字を並べ、+、-を補い式を作り、 値が100になる組み合わせをすべて出力するプログラムを作成せよ(例:12 - 3 - 4 + 5 - 6 + 7 + 89 = 100)。』 という課題が出ました。自分なりに組んでみたのですが、 12個あると聞いたのに、4個しか出力されません><; どこが間違っているのかご教授いただけると幸いですっ ------------------------------------------------------- program KomachiZan(output); var i,s:integer; var sign:array[1..9] of integer; var x,n:longint; begin writeln('< 小町算 -Komachi Zan- >'); for i:=1 to 9 do sign[i]:=-1; repeat x:=0; n:=0; s:=1; for i:=1 to 9 do begin if sign[i]=0 then n:=10*n+1 else begin x:=x+s*n; s:=sign[i]; n:=i; end; end; x:=x+s*n; if x=100 then begin for i:=1 to 9 do begin if sign[i]=1 then write(' + ') else if sign[i]=-1 then write(' - '); write(i); end; writeln(' = 100'); end; i:=9; s:=sign[i]+1; while s>1 do begin sign[i]:=-1; i:=i-1; s:=sign[i]+1; end; sign[i]:=s; until sign[1]>=1; end. -------------------------------------------------------

  • 指定した長さのフィボナッチ数列を出力したい(pascal)

    例えば「長さ:6」と入力すると6桁のフィボナッチ数列の項だけを出力するプログラムを作ってるのですが、意外なところで躓いてしまいました。どこが変なのか教えてください。 program fib_search (input,output); var i,p,x,y : integer; f : array[0..500] of real; function fib(n:integer):integer; begin if(n>=0)and(n<=1) then fib:=1 else fib:=fib(n-1)+fib(n-2); end;{fib} begin writeln('数列の長さ:'); readln(p); x:=0; y:=0; for i:= 1 to 5*p do begin x:= trunc(fib(i)/(10^p)); y:= trunc(fib(i)/(10^(p-1))); if (x=0) and (y>=1) then begin writeln(fib(i)) end end; end. 例えばp=6として、10の6乗で割った数x=0&10の5乗で割った数y>=1 だと6桁、と考えました。1 to 5*p は、ざっと数列を見たところ(桁数×5)項までにその桁の数字はぎりぎり出尽くしている、と考えたからです。 これをコンパイルするとx、y共に「 Replaced '^' with a '+'」と出て、 x:= trunc(fib(i)/10^p); y:= trunc(fib(i)/10^(p-1)) と分母の()を取ると「 Expected ')'」と出てしまいます。 また、「(fib(i))」としても同様「 Replaced '^' with a '+'」と出てしまうのです。

  • パスカル→JAVA

    下記のパスカルからJAVAに変えるのですが、わからなくてこまってます。よろしくおねがいします。 { 宣言部 } type ZISU= array[0..99] of real; var n,k :integer; p,VALREAL,VALIMAG: ZISU; { EXTERNAL procedure EVAL ( p:ZISU; n:integer; var VALREAL,VALIMAG:ZISU ); } {$I B:EVAL.SRC} { メ イ ン プ ロ グ ラ ム } begin write(lst,'Input vector'); writeln(lst); read(n); readln; write(lst,' n=',n); writeln(lst); for k:=0 to n-1 do begin read(p[k]); readln; write(lst,p[k]); writeln(lst) end; EVAL(p,n,VALREAL,VALIMAG); writeln(lst); writeln(ist); write(lst,'Output vector [THE DISCRETE FOURIER TRANSFORM]'); writeln(lst); for k:=0 to n-1 do begin write(lst,' ',VALREAL[k],'+(',VALIMAG[k],'*i)'); writeln(lst) end end. 

  • Pascal言語

    フィボナッチ数列の項は、その直前の連続する二つの項の和である。 f( n ) = f( n - 1 ) + f( n - 2 ) 但し、 f(0) = 0, f(1) = 1 である。   フィボナッチ数列の連続する項の差の比 z = { f( n - 1 ) - f( n - 2 ) }/ { f( n ) - f( n - 1 ) } は、 n が大きくなれば、ある値に収束する。この値の近似値を求める プログラムを書き、その値を示せ。この値は黄金分割比と呼ばれる。 フィボナッチ数列は関数 fibonacci を作って求め、項は配列に表せ。まず 30 項まで求め、黄金分割比の値が収束していく様子を出力して確かめよ。収束判定のために定数 dif = 1.0 e -6 を宣言し、 連続する z の差の絶対値が dif 以下になったとき、収束したとして計算を終了するプログラムを作りなさい。 この問題について質問なんですが コンパイルはできるんだけど、結果がうまく表示されません。 すみませんがわかる方教えてくれませんか? program pe1_2(input,output); const dif = 1.0e-6; var i,m, g : integer; f, z,q : array [0..500] of real; function fibonacci(n: integer):integer; begin if (n >=0) and (n <=1) then fibonacci:=n else fibonacci:=fibonacci(n-1)+fibonacci(n-2); end; { fibonacci } begin f[i]:=fibonacci(i); writeln('30項まで求めます '); for i :=1 to 30 do begin writeln('f(',i:2,')=',f[i]:1); end; write('m='); readln(m); for i:= 3 to m do repeat z[i]:=(f[i-1]-f[i-2])/(f[i]-f[i-1]); until dif >= z[i]-z[i-1]; writeln(z[i]); {writeln('z(',i:3,')=',z[i]:1,','); } end.

  • 最大公約数を再帰で求める(pascal)

    入力した整数値の最大公約数を出力するプログラムを再帰呼び出しの形式で作れ、という課題が出ました。 再帰でない形式は下のように作れたのですが、再帰形式がどうしてもできません。どなたかご教授ください。 function gcd(a,b:integer):integer; {関数部} var tmp:integer; begin if a<b then begin tmp:=b; b:=a; a:=tmp end; repeat tmp:=b; b:=a mod b; a:=tmp until b=0; gcd:=a end; repeat {計算部、i=n=入力した個数、max=入力できる最大数} i:=i+1; n:=n+1; data[i]:=x; writeln('値:'); readln(x); until (x=0) or (i=max); if i>=2 then begin p:=gcd(data[1],data[2]); if i>=3 then begin for i:= 3 to n do begin p:=gcd(p,data[i]) end; writeln('最大公約数:',p) end else begin writeln('最大公約数:',p) end;

  • Pascal  insertの使い方

    プログラミングの授業で 整数(integer)を入力して、金額表示のように3桁ごとにコンマを打って文字列(string)として表示せよ。 という問題が出されました。 やってみた結果が下なんですが、insertがまちがってぃて実行されません。どこが間違ってるか教えてもらえませんか。 program prj7_2(input,output); var st,u,con:string[100]; n,i,x:integer; begin writeln('数を入力してください。'); readln(st); n:=length(st); if n<=3 then writeln(st) else begin i:=1; con:=','; repeat x:=n-3*i; u:=insert(con,st,x); until x:<3; writeln(u); end; end.

  • fortran77で乱数を発生させたい

    fortran77で乱数を発生させたい こんばんわ。fortran77で乱数を発生させるにはどうすればいいのでしょうか? 調べてみるとfortran90ならば乱数の組み込み関数が用意されているようなのですが、fortran70にはないそうです。   real function random(i)    i=843314861*i+453816693    random=real(i)/2**31   end function   do 10 k=1,n    ransu(k)=random(i) 10 continue これを用いることで乱数が発生できると書いてあったのですが、オーバーフローしてしまったせいか、値がマイナスのものが出てきてしまい、うまくできませんでした。 これ以外にも方法はないでしょうか? 私の環境はsalford FTN77です。 回答よろしくお願いします。

  • 除算がなぜかできません(pascal)

    フィボナッチ数列の連続する項の差の比  z(n) = { f(n-1) - f(n-2) } / { f(n) - f(n-1) } 、 これのz(n-1),z(n)の差の絶対値がある定数以下になった時(100項まで)に計算を終了するプログラムを作ったのですが、何度コンパイルしても上の式の除算部でエラーが起きてしまいます。 どこがおかしいのかご教授ください。 program Toi3 (input,output); const dif = 1.0 * exp(-6); var n : integer; result : real; function f(n:integer):integer; begin if(n>=0)and(n<=1) then f:=1 else f:=f(n-1)+f(n-2); end;{f} function z(n:integer):real; begin z := {f(n-1) - f(n-2)}/{f(n)-f(n-1)} end; begin n:=2; while (n=100) or (result<dif) do begin n:=n+1; result:= abs(z(n)-z(n-1)) end; if n=100 then begin result:= abs(z(100)-z(99)); if result<dif then begin writeln('収束した') end else begin writeln( z(100),'収束しなかった') end end else begin writeln('収束した') end end. エラー: 17 z := {f(n-1) - f(n-2)}/{f(n)-f(n-1)} E 18460--------------------------------^--- Replaced '/' with a identifier In function z: w 18270 variable n is never used

  • Pascalでの選択ソート

    program sort(input, output); const numofdata =100 ; var d: array [1..numofdata] of integer; i,j,k: integer; tmp: integer; begin for i:=1 to numofdata do begin read(d[i]); end; for i:=1 to numofdata-1 do begin j:=i; for k:=i+1 to numofdata do begin if d[j]>d[k] then j:=k; end; tmp:=d[j]; d[j]:=d[i]; d[i]:=tmp; end; for i:=1 to numofdata do begin writeln(d[i]) end end. このプログラムを、データ数(1個から最大10000個まで)を最初に入力できるように変更するには、どうすればよいのでしょうか。教えてください。