No.3ベストアンサー
- 回答日時:
No.2の方が書かれているとおり、最初の積算で unsigned intの扱える値の範囲を超えて(オーバーフロー)しまっているものと思われます。
除算を先にすれば一応解決するはずです。
ul = (unsigned long)(4294967295.l * (rand() / (double)(RAND_MAX + 1)));
ただ、環境にも依りますが rand()の精度が問題になりそうです。
RAND_MAXが 4294967295ならば問題はありませんが、それよりも小さな値の場合、0~4294967295の値の中の分解能が低くなるので、同じ値が出る確率が 1/4294967295よりも大きくなります。
(うちの VC7.1は RAND_MAXが 32767だったので、同じ値が出る可能性は 1/32767です)
その確率を 1/4294967295にしたい場合は、例えば下記のように少し工夫が必要です。
int d = ULONG_MAX / RAND_MAX;
int m = ULONG_MAX % RAND_MAX + 1;
unsigned long ul = rand() * d + rand() % m;
この回答への補足
指摘の通り直したところ、精度があがったようです。
と言うのは、
ul = 4294967295UL * (rand() / (RAND_MAX + 1.0));
で出てくるulは、16進に直すと必ず e98dffff,3341ffff などfが4つ続く数字となりました。d,mを導入することで、それが解消されたようです。
No.5
- 回答日時:
スケーリングして拡大しても、隙間が空いてしまうので、2階建てにしたほうがよいと思います。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int
main(void)
{
unsigned long long rnd;
int cnt[100];
int i;
srand(time(0));
for (i = 0; i < 100; i++) {
cnt[i] = 0;
}
for (i = 0; i < 100000; i++) {
rnd = (unsigned long long) rand() *RAND_MAX + rand();
cnt[(int)((double) rnd / RAND_MAX / RAND_MAX * 100)]++;
}
for (i = 0; i < 100; i++) {
printf("%5d%10d\n",i, cnt[i]);
}
return 0;
}
No.4
- 回答日時:
C初心者なのになぜそんなことがしたいのかが疑問。
No.2
- 回答日時:
思ったことその1: かけ算のところでオーバーフローする可能性があります.
その2: そんな広い範囲にするために rand を使うのは無謀です. 別の関数を探すべし.
この回答への補足
回答ありがとうございます。
ご指摘の通り、オーバーフローを起こしているようです。
ul = 4294967295UL * rand() / (RAND_MAX + 1);
を
ul = 4294967295UL * (rand() / (RAND_MAX + 1.0));
に直したところ、うまくいきました。
1の部分も1.0でないとまずいようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- その他(プログラミング・Web制作) どうしてもエラーが解決できません。 1 2022/07/23 04:32
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- PHP PHPを使って、別サイトの一部を取得して表示したいのです。。 1 2023/01/18 21:45
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- 統計学 Excelによるサンプルの拡大について 6 2023/08/22 16:03
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
VB6.0-整数と余りを求める
-
ラジオボタンの値の取得につい...
-
数字の位ごとの値を表示するプ...
-
VBAで配列のNULL判定
-
Rubyで1ミリ秒のsleepできない...
-
Access2003 オートナンバーの現...
-
c++ 二体問題のソースコードを...
-
1つ前の値を変数に保存する方法
-
C言語(DXlib)での音ゲーについ...
-
vbaで極大値を抽出する方法
-
VBAで72時間タイマーがオーバー...
-
DataGridView 複数行同時変更...
-
DWORDって
-
10進数をアスキーコードに変換
-
VBで余りを求める
-
long型のランダムな値を返す方法
-
VBAでダブルコーテーション入り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォームを開くときに、コンボ...
-
足して100になるような乱数のア...
-
Excel-vba 文字列と変数を...
-
C言語 exitの使い方
-
VB6.0-整数と余りを求める
-
VBAで配列のNULL判定
-
数字の位ごとの値を表示するプ...
-
VBAの定数の使い方で、計算値を...
-
フリーランタイマーの時間差分...
-
C#で動的にコントロールを取得...
-
10進数をアスキーコードに変換
-
コンボボックスの名前を変数に...
-
1つ前の値を変数に保存する方法
-
ラジオボタンの値の取得につい...
-
スピンボタンで小数点
-
相関係数p値の出し方
-
C言語でCLAMP(a,b,c)
-
DataGridView 複数行同時変更...
-
VBAのチェックボックス結果を集...
-
データ構造のmapとは?
おすすめ情報