From within Sage, I'd probably do something like
sage: m = Matrix(RR, 3, lambda i,j: normalvariate(0, 1))
sage: m
[ -2.62449138547238 0.892440016295533 0.370843911194638]
[-0.556296861517236 0.298136996038704 0.244309907008598]
[ -1.48878357104797 0.424470381797098 -1.02406746759107]
for the first. (See also numpy.random.normal
, although you'd have to feed it into a Matrix
to get the full Sage functionality anyway.)
For the second, the best way would depend upon whether you want to specify an exact number of non-zero terms or only an approximate fraction. If exact, then maybe just use sample
to decide which terms you want to be nonzero and use the dict
constructor:
sage: sample(xrange(10), 3)
[8, 1, 6]
sage: {index: normalvariate(0, 1) for index in sample(xrange(10), 3)}
{0: 0.6312570531236461, 1: -0.3442153313732221, 7: 0.12271841036659839}
sage: vector(RR, 10, {index: normalvariate(0, 1) for index in sample(xrange(10), 3)})
(0.000000000000000, 0.000000000000000, 0.000000000000000, -2.16336854587694, -0.123030170562214, 0.000000000000000, 0.000000000000000, -1.99437183544239, 0.000000000000000, 0.000000000000000)
[Note that since I'm computing new random numbers each time, the three lines above aren't consistent with each other. But you should get the idea.]