time()

B

Bill Cunningham

I have no idea what to do with time () or another function to change the
time_t data type to int to get numbers say from 0-20 that are ints. time()
reports a huge number of seconds and when using rand() truely produce a fake
randomness. I want smaller numbers. We have functions like strtod and strtol
to change chars into doubles or longs why not change time_t to int?

Bill
 
T

Thad Smith

Bill said:
I have no idea what to do with time () or another function to change the
time_t data type to int to get numbers say from 0-20 that are ints.

What units do you want? gmtime() will convert time_t into struct tm
fields. Standard C doesn't define the encoding of time_t values.
time()
reports a huge number of seconds
maybe

and when using rand() truely produce a fake
randomness.

A pseudo random numbergenerator does not generate true random values.

I want smaller numbers.

Take 0 -- it's a small number. If that isn't sufficient, define your
requirements more precisely.

We have functions like strtod and strtol
to change chars into doubles or longs why not change time_t to int?

gmtime() and localtime() do that.
 
K

Keith Thompson

Bill Cunningham said:
I have no idea what to do with time () or another function to change the
time_t data type to int to get numbers say from 0-20 that are ints.

What for? If you want numbers in the range 0-20, what does that have
to do with time()?
time()
reports a huge number of seconds and when using rand() truely produce a fake
randomness.

I don't know what you mean by that. You're using time() and rand()
together somehow? How exactly? Presumably srand() is involved
somehow, but you didn't mention it.
I want smaller numbers. We have functions like strtod and strtol
to change chars into doubles or longs why not change time_t to int?

time_t is an arithmetic type capable of representing times. That's
*all* the standard tells you about it. You can convert a time_t value
to int the same way you'd convert any numeric type to another one
(just assign it), but that's not a useful thing to do; for one thing,
the result of time() may or may not fit within the range of int.

Let's back off a bit. You're trying to accomplish something, but you
haven't actually told us exactly what it is. Instead, you've thrown
together a few things that you might *use* to accomplish something
(time(), type time_t, type int, numbers in the range 0-20, rand(),
"smaller numbers") -- things that apparently aren't doing what you
want them to do.

It's like asking "Should I use a hammer or a screwdriver? What about
a staple gun?" without saying what you're trying to build.

First, tell us *exactly* what you want to accomplish. State your
problem without referring to any possible solution or piece of a
solution.

Then, *separately*, you might ask whether some proposed solution, or
something like it, will do what you want. If you can express the
proposed solution in C code, even if it doesn't work or is incorrect,
that's great. But we can't help without knowing what you're trying to
do.

Have you read <http://www.catb.org/~esr/faqs/smart-questions.html>?

You might also take a look at section 13 in the comp.lang.c FAQ,
particularly the questions on random numbers.
 
B

Bill Cunningham

[snip]
Let's back off a bit. You're trying to accomplish something, but you
haven't actually told us exactly what it is. Instead, you've thrown
together a few things that you might *use* to accomplish something
(time(), type time_t, type int, numbers in the range 0-20, rand(),
"smaller numbers") -- things that apparently aren't doing what you
want them to do.

It's like asking "Should I use a hammer or a screwdriver? What about
a staple gun?" without saying what you're trying to build.

First, tell us *exactly* what you want to accomplish. State your
problem without referring to any possible solution or piece of a
solution.

Then, *separately*, you might ask whether some proposed solution, or
something like it, will do what you want. If you can express the
proposed solution in C code, even if it doesn't work or is incorrect,
that's great. But we can't help without knowing what you're trying to
do.

Say you have two dice of six sides. Can you use rand() to create 12
options by rolling the die. Now there's another way you can do this simply
but using arrays but I do not know how. Something like this.

int a [12];

Ok there's 12 objects or

int a [20];

like I want. I can use for to loop over them but I can't get randomness.
That's a feature I do not know how to reproduce. It will have to someway
depend on the system and most use the system time.

Bill
 
B

Bill Cunningham

[snip]
Note that if you use pseudo-random numbers to implement casino games
and let the public play these games, betting REAL money, you're going
to lose your shirt.

Something like rand() % 21 will generate numbers from 0 .. 20, inclusive,
but the distribution will not be exactly even since 21 does not divide
RAND_MAX+1 evenly.

Seeding rand() is often done with the system time, like:

srand((unsigned) time() );

I want to create a utility for playing online game like RPGs. So I was
wanting to write a "dice rolling" utility. That's exactly what I am wanting.

Bill
 
K

Keith Thompson

Bill Cunningham said:
[snip]
Let's back off a bit. You're trying to accomplish something, but you
haven't actually told us exactly what it is. Instead, you've thrown
together a few things that you might *use* to accomplish something
(time(), type time_t, type int, numbers in the range 0-20, rand(),
"smaller numbers") -- things that apparently aren't doing what you
want them to do.

It's like asking "Should I use a hammer or a screwdriver? What about
a staple gun?" without saying what you're trying to build.

First, tell us *exactly* what you want to accomplish. State your
problem without referring to any possible solution or piece of a
solution.

Then, *separately*, you might ask whether some proposed solution, or
something like it, will do what you want. If you can express the
proposed solution in C code, even if it doesn't work or is incorrect,
that's great. But we can't help without knowing what you're trying to
do.

I wrote the above. When you posted your followup, your newsreader
should have provided an attribution line, something like


Please leave that line in place. Quoting somebody without attribution
is considered rude. (I think I've told you this before.)
Say you have two dice of six sides. Can you use rand() to create 12
options by rolling the die. Now there's another way you can do this simply
but using arrays but I do not know how. Something like this.

int a [12];

Ok there's 12 objects or

int a [20];

like I want. I can use for to loop over them but I can't get randomness.
That's a feature I do not know how to reproduce. It will have to someway
depend on the system and most use the system time.

You're still not making sense.

If I roll two six-sided dice, there are 36 (6*6) possible outcomes,
not 12. I suppose you could divide these up into 12 sets of 3
outcomes each, but I suspect that's not what you had in mind.

You stated your problem extremely vaguely, and mixed it with a
mishmash of possible pieces of a solution (rand(), a 12-element or
20-element array, a for loop, the system time). That's exactly what I
asked you not to do.

Please start by stating the problem you're trying to solve *without*
reference to the method used to solve it. Don't talk about rand(), or
time_t, or time(). Tell us what result you're trying to achieve. You
should be able to do that in one sentence or one short paragraph.

An example:

I want to generate a sequence of 73 uniformly distributed random
numbers, each in the range 37 to 153. I want the sequence to be
different each time I run my program.

(I've deliberately written something that differs from what you seem
to be looking for. You need to tell us what you want.)

Once you've done that, and *only* after you've done that, you can ask
whether certain tools (rand(), time(), a for loop) might or might not
be part of a solution.
 
K

Keith Thompson

time_t *is* an integer type, although it need not represent a "number
of <time unit> since <epoch>". It might not fit in an int.

time_t is an integer type on most implementations. The standard only
guarantees that it's an arithmetic type capable of representing times.
It could be floating-point. (It could even, in a sufficiently
perverse implementation, be complex or imaginary.)

(I do not give permission to quote this article, or any other article
I post to Usenet, without attribution.)
 
B

Bill Cunningham

I wrote the above. When you posted your followup, your newsreader
should have provided an attribution line, something like


Please leave that line in place. Quoting somebody without attribution
is considered rude. (I think I've told you this before.)

Now is this how it should be. I'm using outlook express :( It took me
awhile way way back to learn not to top post. Sorry I will work on this. I
have to do it all manually.

Bill
 
B

Bill Cunningham

(I do not give permission to quote this article, or any other article
I post to Usenet, without attribution.)
What do you mean by this Keith? Do you not want to be quoted in clc's
message threads?

Bill
 
B

Bartc

Keith Thompson said:
Bill Cunningham said:
[snip]
Say you have two dice of six sides. Can you use rand() to create 12
options by rolling the die. Now there's another way you can do this
simply
but using arrays but I do not know how. Something like this.

int a [12];

Ok there's 12 objects or

int a [20];

like I want. I can use for to loop over them but I can't get randomness.
That's a feature I do not know how to reproduce. It will have to someway
depend on the system and most use the system time.

You're still not making sense.

If I roll two six-sided dice, there are 36 (6*6) possible outcomes,
not 12. I suppose you could divide these up into 12 sets of 3
outcomes each, but I suspect that's not what you had in mind.

I make it only 11 outcomes (1+1 to 6+6). Although if you listed all
combinations there would be 36.

If certain combinations are important, then you can list the 6 outcomes for
each die separately, totalling 12 outcomes.
 
B

Bill Cunningham

pete said:
/* BEGIN dice.c */

#include <stdio.h>
#include <stdlib.h>

#define THROWS 1000
#define str(s) # s
#define xstr(s) str(s)

int main(void)
{
int sum[13] = {0};
unsigned count = THROWS;

while (count-- != 0) {
++sum[rand() % 6 + 1 + rand() % 6 + 1];
}
puts("Dice totals from "xstr(THROWS)" throws of a pair of dice:");
puts("value count");
for (count = 0; count != sizeof sum / sizeof *sum; ++count) {
printf("%2u %2d\n", count, sum[count]);
}
return 0;
}

/* END dice.c */

Thanks Pete but I can't read some of the program. What does int sum
[13]={0}; mean? Why is there a zero in parenthesis? Also
#define str(s) # s
#define xstr(s) str(s)

What does that code do?

The rest I can pretty much make out. But what does the % after rand mean?

This is how to learn C.

Bill
 
K

Keith Thompson

Bill Cunningham said:
What do you mean by this Keith? Do you not want to be quoted in clc's
message threads?

No, I do not want to be quoted *without attribution*.

Gordon Burditt deliberately deletes attribution lines from quoted
material when he posts followups. The above was directed primarily at
him. He's welcome to quote me (as is anyone else), but not without
giving me credit for my words.
 
L

Lew Pitcher

pete said:
/* BEGIN dice.c */

#include <stdio.h>
#include <stdlib.h>

#define THROWS 1000
#define str(s) # s
#define xstr(s) str(s)

int main(void)
{
int sum[13] = {0};
unsigned count = THROWS;

while (count-- != 0) {
++sum[rand() % 6 + 1 + rand() % 6 + 1];
}
puts("Dice totals from "xstr(THROWS)" throws of a pair of dice:");
puts("value count");
for (count = 0; count != sizeof sum / sizeof *sum; ++count) {
printf("%2u %2d\n", count, sum[count]);
}
return 0;
}

/* END dice.c */

Thanks Pete but I can't read some of the program. What does int sum
[13]={0}; mean? Why is there a zero in parenthesis?

int sum[13] = {0};

declares sum to be an array of 13 integers, and initializes all elements of
the array to zero. The
{0}
is short form for
{0,0,0,0,0,0,0,0,0,0,0,0,0}

Also
#define str(s) # s

What does that code do?

The first #define defines a macro that expands into the macro argument
preceded by the "stringize" macro operator. The second #define defines a
macro that uses the first macro to change it's argument into a string.

Together, they make it such that, with
#define THROWS 1000
the macro invocation
xstr(THROWS)
expands to
str(1000)
which expands to
# 1000
which "stringizes" into the C string
"1000"
The rest I can pretty much make out. But what does the % after rand mean?

That's the C "modulo" operator. It provides the remainder of an integer
division. 3 / 2 == 1
3 % 2 == 1 == (3 - ((3/2)*2))

This is how to learn C.

--
Lew Pitcher

Master Codewright & JOAT-in-training | Registered Linux User #112576
http://pitcher.digitalfreehold.ca/ | GPG public key available by request
---------- Slackware - Because I know what I'm doing. ------
 
K

Keith Thompson

Bartc said:
Keith Thompson said:
Bill Cunningham said:
[snip]
Say you have two dice of six sides. Can you use rand() to create 12
options by rolling the die. Now there's another way you can do this
simply
but using arrays but I do not know how. Something like this.

int a [12];

Ok there's 12 objects or

int a [20];

like I want. I can use for to loop over them but I can't get randomness.
That's a feature I do not know how to reproduce. It will have to someway
depend on the system and most use the system time.

You're still not making sense.

If I roll two six-sided dice, there are 36 (6*6) possible outcomes,
not 12. I suppose you could divide these up into 12 sets of 3
outcomes each, but I suspect that's not what you had in mind.

I make it only 11 outcomes (1+1 to 6+6). Although if you listed all
combinations there would be 36.

Exactly. 1+6 is distinct from 2+5, for example.
If certain combinations are important, then you can list the 6 outcomes for
each die separately, totalling 12 outcomes.

Only if you first randomly choose one of the two dice to throw by
itself.
 
K

Keith Thompson

pete said:
Keith said:
Bartc said:
[snip]
Say you have two dice of six sides. Can you use rand() to create 12
options by rolling the die. Now there's another way you can do
this simply
but using arrays but I do not know how. Something like this.

int a [12];

Ok there's 12 objects or

int a [20];

like I want. I can use for to loop over them but I can't get randomness.
That's a feature I do not know how to reproduce. It will have to someway
depend on the system and most use the system time.
You're still not making sense.

If I roll two six-sided dice, there are 36 (6*6) possible outcomes,
not 12. I suppose you could divide these up into 12 sets of 3
outcomes each, but I suspect that's not what you had in mind.
I make it only 11 outcomes (1+1 to 6+6). Although if you listed all
combinations there would be 36.

Exactly. 1+6 is distinct from 2+5, for example.

But more controversially, 1+6 is distinct from 6+1,
if you think that there are 36 (6*6) possible outcomes.

There are 36 equally probable outcomes. Use differently colored dice
to make this clearer.

But the point is that the OP was talking about 12 outcomes, which
doesn't make any sense unless he wants to divide the 36 outcomes into
12 sets of 3 each. I seriously doubt that that's what he had in mind,
though; he probably was thinking that 6 outcomes for one die plus 6
for the other equals 12 possible outcomes.
 
B

Bartc

Keith Thompson said:
Bartc said:
Keith Thompson said:
[snip]
Say you have two dice of six sides. Can you use rand() to create 12
options by rolling the die. Now there's another way you can do this
simply
but using arrays but I do not know how. Something like this.

int a [12];

Ok there's 12 objects or

int a [20];

like I want. I can use for to loop over them but I can't get
randomness.
That's a feature I do not know how to reproduce. It will have to
someway
depend on the system and most use the system time.

You're still not making sense.

If I roll two six-sided dice, there are 36 (6*6) possible outcomes,
not 12. I suppose you could divide these up into 12 sets of 3
outcomes each, but I suspect that's not what you had in mind.

I make it only 11 outcomes (1+1 to 6+6). Although if you listed all
combinations there would be 36.

Exactly. 1+6 is distinct from 2+5, for example.
If certain combinations are important, then you can list the 6 outcomes
for
each die separately, totalling 12 outcomes.

Only if you first randomly choose one of the two dice to throw by
itself.

They're identical. It doesn't matter which one is thrown first. Just program
the machine 'not to look' until the second one is thrown.

Anyway it's not clear why arrays are needed. Each double throw can be
represented by a single char value.
 
J

Joachim Schmitz

Gordon said:
Note that rolling two dice of six sides each (adding the results)
and rolling one die of 12 sides does NOT generate the same probability
distribution.
Esp. the probabily of a 1 is 0 with 2 dice.

Bye, Jojo
 
J

Joachim Schmitz

Bill said:
Now is this how it should be. I'm using outlook express :( It
Me too, and I never had that issue.
took me awhile way way back to learn not to top post. Sorry I will
work on this. I have to do it all manually.
Have a look at OE-QuoteFix. It solves several weaknesses of OE

Bye, Jojo
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,767
Messages
2,569,570
Members
45,045
Latest member
DRCM

Latest Threads

Top